1、 scanf()函数是格式化输入函数,它从标准输入设备(键盘)缓存中读取输入的信息。
其调用格式为: scanf("<格式化字符串>",<地址表>),如下所示:
- int a;
- scanf("%d",&a);
以上代码会将键盘的输入转换成int类型,并赋值给a。
所有转换指定符的含义如下:
转换字符
|
含义
|
d
|
将输入转换成int
|
i
|
将输入转换成int。如果加了前缀0,就输入八进制数。0x或OX,则输入十六进制数
|
o
|
将输入转换成int,并假定所有的数字都是八进制数
|
u
|
将输入转换成unsigned int
|
x
|
将输入转换成int,并假定所有的数字都是十六进制数
|
c
|
将下一个字符读入为char类型(包含空白)。如果在读入单个字符时要忽略空白,就在格式指定符的前面加上一个空白字符。
|
s
|
从下一个非空白字符开始,输入一串连续的非空白字符
|
e、f、g
|
将输入转换成float类型,输入中的小数点和指数是可选的。
|
n
|
不读入任何输入,但前面读到此处为止的数字字符存储在对应的int*类型参数中
|
下表中,是转换指定符的应用实例:
指定符
|
说明
|
%lf
|
将下一个值读取为double类型
|
%*d
|
读入下一个整数值,但不存储它
|
%lc
|
将一下字符读取为wchar_t类型
|
%\nc
|
将下一个字符读取为char类型,并忽略空白字符
|
%10lld
|
将接下来的10个字符读取为long long类型的整数值 |
%5d
|
将接下来的5个字符读取为一个整数
|
%Lf
|
将下一个值读取为long double类型的浮点数 |
%hu
|
将下一个值读取为unsigned short类型 |
M
|
指定输入数据所占宽度
|
*
|
空读一个字符,有了这个符号,只会读取,但不存储
|
H
|
输入“短”数据
|
L
|
输入“长”数据
|
2、空白字符
在scanf函数在从键盘读取的时候,会自动忽略一个或多个空白字符。
3、非空白字符()
一个非空白字符会使scanf函数在读取的时候,剔除掉与这个非空白字符相同的字符。
地址表是需要读入的所有变量的地址,而不是变量本身,这个与printf()函数不同,需要特别注意!
- #include <stdio.h>
- int main()
- {
- int i,j;
- printf("i = %d,j = %d\n",i,j);
- scanf("%d,%d",&i,&j);
- return 0;
- }
说明:scanf()函数先读一个整型数,然后把接着输入的逗号剔除掉,最后读入另一个整型数。如果","这一特定字符没有找到,scanf()函数就终止。若参数之间的分隔符为空格,则参数之间必须输入一个或多个空格。
4、地址问题
对于字符串数组或者是字符串指针变量,由于数组名和指针变量名本身就是地址,因此在使用scanf函数的时候,不需要加&操作符。
- #include <stdio.h>
- int main()
- {
- char *p = NULL;
- char str1[20],str2[20];
- p = str2;
- scanf("%s",str1);
- printf("str1 = %s ",str1);
- printf("str2 = %s\n",p);
- return 0;
- }
输入:123 \n 345 输出结果: str1 = 123 str2 = 345。输出正确
5、输入控制
可以在格式化字符串中的"%"各转换指定符之间加入一个整数,表示任意数读取中的最大位数。
如上例中,若规定只能输入2个字符给字符串数组str1,则需要在第一条更改为:
- #include <stdio.h>
- int main()
- {
- char *p = NULL;
- char str1[20],str2[20];
- p = str2;
- scanf("%2s",str1);
- scanf("%s",p);
- printf("str1 = %s\n",str1);
- printf("str2 = %s\n",p);
- return 0;
- }
程序运行时一旦输入字符个数大于2,str1就不再继续读入,而后面的一个读入函数即scanf("%s", p)就会从第3个字符开始读入。
所以当输入一次输入的字符大于2的时候,剩下的部分会由字符串指针p接收,事实上,就这等于执行第二个scanf语句。所以,如果第一次输入的字符个数大于2,那么按回车之后,程序就会打印了。
6、多个数值数据
在输入多个数值数据时,若格式控制串中没有非格式字符作输入数据之间的间隔则可用空格,TAB或回车作间隔。C编译在碰到空格,TAB,回车或非法数据(如对"%d"输入"12A"时,A即为非法数据)时即认为该数据结束,看下面的例子:
- #include <stdio.h>
- int main()
- {
- int a;
- scanf("%d",&a);
- printf("after a = %d\n",a);
- return 0;
- }
输入:12A 输出: after a = 12
7、字符串数据(%c)问题
在使用scanf函数的时候,如果格式化字符串指定为"%c",则会将所有输入的字符均认为是有效的字符,看下面程序:
- #include <stdio.h>
- int main()
- {
- char a,b,c;
- scanf("%c%c%c",&a,&b,&c);
- printf("a = %c,b = %c,c = %c\n",a,b,c);
- return 0;
- }
输入:a(空格)b(空格)c 输出: a = a b = (空格) c = b
输出并未按照我们的想法输出。
由于没有指定分割符,所以,在读取输入的时候,scanf将空格也作为一个有效字符进行读取,并赋值给第二个变量。故b的值就是一个空格而已。
如果加了分割符,如下:
- #include <stdio.h>
- int main()
- {
- char a,b,c;
- scanf("%c %c %c",&a,&b,&c);
- printf("a = %c,b = %c,c = %c\n",a,b,c);
- return 0;
- }
输入:a(空格)b(空格)c 输出: a = a b = b c = c
本文出自 “Linux的生活” 博客,谢绝转载!