scanf

来源:互联网 发布:火眼金睛 软件 编辑:程序博客网 时间:2024/05/21 17:22
scanf()函数返回成功赋值的数据项数,读到文件末尾出错时则返回EOF。
ret=scanf("%d%d",&a,&b);
如果a和b都被成功读入,那么scanf的返回值就是2
如果只有a被成功读入,返回值为1
如果a和b都未被成功读入,返回值为0
如果遇到错误或遇到end of file,返回值为EOF。且返回值为int型.

格式说明符

转换字符(就是%后跟的部分)
a 读浮点值(仅适用于 C99)
A 读浮点值(仅适用于 C99)
c 读单字符
d 读十进制整数
i 读十进制、八进制、十六进制整数
e 读浮点数
E 读浮点数
f 读浮点数
F 读浮点数(仅适用于 C99)
g 读浮点数
G 读浮点数
o 读八进制数
s 读字符串
x 读十六进制数
X 读十六进制数
p 读指针值
n 至此已读入值的等价字符数
u 读无符号十进制整数
[ ] 扫描字符集合
% 读 % 符号(百分号)
附加格式说明字符表修饰符说明
L/l 长度修饰符 输入"长"数据
h 长度修饰符 输入"短"数据
W 整型常数 指定输入数据所占宽度
空白符
空白字符会使scanf()函数在读操作中略去输入中的一个或多个空白字符。

非空白符

一个非空白字符会使scanf()函数在读入时剔除掉与这个非空白字符相同的字符。
例子:
(1) 如果格式控制串中有非格式字符则输入时也要输入该非格式字符。
例如:
scanf("%d,%d,%d",&a,&b,&c);
其中用非格式符“ , ”作间隔符,故输入时应为:
5,6,7
又如:
scanf("a=%d,b=%d,c=%d",&a,&b,&c);
则输入应为
a=5,b=6,c=7
(2)键盘缓冲区残余信息问题
1
2
3
4
5
6
7
8
9
10
11
12
13
#include<stdio.h>
intmain(void)
{
inta;
charc;
while(c!='N')
{
scanf("%d",&a);
scanf("%c",&c);
printf("a=%dc=%c\n",a,c);/*printf("c=%d\n",c);*/
}
return0;
}
scanf("%c", &c);这句不能正常接收字符,什么原因呢?我们用printf("c = %d\n", c);将C用int表示出来,启用printf("c = %d\n", c);这一句,看看scanf()函数赋给C到底是什么,结果是c=10 ,ASCII值为10是什么?换行即\n.对了,我们每击打一下"Enter"键,向键盘缓冲区发去一个“回车”(\r),一个“换行"(\n),在这里\r被scanf()函数处理掉了(姑且这么认为吧^_^),而\n被scanf()函数“错误”地赋给了c.解决办法:可以在两个scanf()函数之后加getch(), getchar(),但是要视具体scanf()语句加那个,这里就不分析了,读者自己去摸索吧。
(3)如何处理scanf()函数误输入造成程序死锁或出错
1
2
3
4
5
6
7
8
9
#include<stdio.h>
intmain(void)
{
inta,b,c;
scanf("%d,%d",&a,&b);
c=a+b;/*计算a+b*/
printf("%d+%d=%d",a,b,c);
return0;
}
如上程序,如果正确输入a,b的值,那么没什么问题,但是,你不能保证使用者每一次都能正确输入,一旦输入了错误的类型,你的程序不是死锁,就是得到一个错误的结果,呵呵,这可能所有人都遇到过的问题吧?解决方法:scanf()函数执行成功时的返回值是成功读取的变量数,也就是说,你这个scanf()函数有几个变量,如果scanf()函数全部正常读取,它就返回几。但这里还要注意另一个问题,如果输入了非法数据,键盘缓冲区就可能还个有残余信息问题。正确的例程:
1
2
3
4
5
6
7
8
9
10
#include<stdio.h>
intmain(void)
{
inta,b,c;
while(scanf("%d%d",&a,&b)!=2)
fflush(stdin); //可能不兼容
c=a+b;
printf("%d+%d=%d",a,b,c);
return0;
}




0 0
原创粉丝点击