在C语言中最常用的函数应该就是scanf,printf吧。对于大量输入输出时C++也常用scanf和print代替cin和cout。然而我们学习C语言最先接触的scanf和printf其实我们并不完全了解。
scanf
按照 C++ reference 的介绍,scanf 的原型为1
2int scanf ( const char * format, ... );
format = %[*][width][length]specifier
其中上面的[*]表示输入的东西被忽略,[width] 表示最大输入长度,而 [length] 表示是类型的一种延伸,可以是 hh, h, l, ll, j, z, t, L 中的一种。例如1
2
3
4
5
6
7
8
9
10#include <cstdio>
/*------ Welcome to visit blog of dna049: http://dna049.com ------*/
int main(){
long n;
scanf("%3ld",&n);
printf("%ld\n",n);
return 0;
}
// input : 12345
// output: 123
specifier 是必选项 它可以是 $i,d,u,o,x,f,e,g,a,c,s,p,n,%$。还有两个特殊的 [characters]和[^characters]。上面的参数就不过多说了。特别要强调的是这两个特殊的。
[characters] 表示只接受 [characters] 中的字符;[^characters] 表示只不接受 [characters] 中的字符。例如:
1 | #include <cstdio> |
特别注意
在使用下面语句进行输入时遇到空白符(whitespace)会结束输入的。1
scanf("%s",str);
whitespace可以使用int isspace ( int c );判断。有这些字符有:
scanf典型例子
有时我们明确知道输入为 $(a,b)$ 这种类型,我们可以这样做
1
scanf("(%d,%d)",&a,&b);
输入字符包含除回车之外的字符
1
scanf("%[^\n]",str);
只输入小写字母和数字
1
scanf("%[0-9a-z]",str);
scanf 返回值
- 正整数:表示正确输入参数的个数
- 0:输入不匹配,无法正确输入任何值
- EOF(一般为-1)为读到文件结尾或在terminal中输入了 ctrl + z
printf
print 的原型为1
2int printf ( const char * format, ... );
%[flags][width][.precision][length]specifier
specifier 和 scanf 的类似就不多说了。[length] [width]同理。[.precision] 一看就懂
[flags] 可选有 -,+,#,0。其中
- - 表示在给定宽度内向左靠齐。默认向右见下例子
- + 表示即使是非负数,前面也要加正号。
- # 目前不清楚用法。
- 0 就是在不足宽度的时候补0
1 | double a = 123.45678; |
神器:sscanf 和 sprintf
不多说了,举个例子说明问题吧1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18#include<cstdio>
int main(){
/* sscanf example */
char sentence []="Rudolph is 12 years old";
char str [20];
int i;
sscanf (sentence,"%s %*s %d",str,&i);
printf ("%s -> %d\n",str,i);
/* sprintf example */
char buffer [50];
int n, a=5, b=3;
n=sprintf (buffer, "%d plus %d is %d", a, b, a+b);
printf ("[%s] is a string %d chars long\n",buffer,n);
return 0;
}
// output:
// Rudolph -> 12
// [5 plus 3 is 8] is a string 13 chars long
最后说一个比较诡异但是可以理解的事情
sacnf 输入 float 和 double 时分别用 %f,%lf。
printf 输出 float 和 double 时用的都是 %f。