Scanf( )函数错误经验详解:
在linux应用程序编写过程中经常通过键盘达到给变量输入数据、字符、字符串的目的。而要实现该功能scanf()又是用的最对多的一个函数,用此函数时,稍微不注意就会出现错误,而且其错误又具有隐蔽性(我就遇到过),因此,在这里做一点小小的经验总结,不足之处还望大家多多指点:
一、函数介绍:
函数名:scanf
用 法:int scanf(char *format[,argument,...]);
功 能:执行格式化输入
说 明:scanf()函数是通用终端格式化输入函数,它从标准输入设备(键盘) 读取输入的信息。
可以读入任何固有类型的数据并自动把数值变换成适当的机内格式。
返回值:根据scanf()函数结构我们晓得函数运行成功是返回一个整型数据却不晓得该整型数据是什么,这个我也是后来才发现的,scanf函数的返回值是成功匹配的项数。讲个例子应该更明白些吧:
main( )
{
int a,b,c;
printf(%d\\n”,scanf(“%3d-%2d-%4d”,&a,&b,&c));
printf(“a=%d,b=%d,c=%d\\n”,a,b,c);
}
输入:123-45-6789(回车)
输出:3
a=123,b=45,c=6789
正确地输入了三个数,scanf正常结束,canf返回值为3,,作为printf的参数项,由printf输出.所以,运行结果第一行为3。
二、常见错误举例:
1、sacnf()中的变量必须使用地址。
scanf(\"%d%d\错误
scanf(\"%d%d\
2、空白符问题
#include main ( ) { int a; printf(\"input the data\\n\"); scanf(\"%d\\n\这里多了一个回车符\\n printf(\"%d\ return 0; } 程序运行的结果是要输入两个数程序才结束。 原因:用空白符结尾时,scanf会跳过空白符去读下一个字符,所以你必须再输入一个数。这里的空白符包括空格,制表符,换行符,回车符和换页符。所以如果你用scanf(\"%d \也会出现同样的问题。 3、缓冲区问题 #include main() { int n = 5; char c[n]; for(int i = 0; i < n; i++) c[i] = scanf(\"%c\ printf(c); return 0; } 如果输入: a b c 那么循环就会“提前”结束了. 原因:输入a和第一个回车后,a和这个回车符都留在缓冲区中。第一个scanf读取了a,但是输入缓冲区里面还留有一个\\n,第二个scanf读取这个\\n。然后输入b和第二个回车,同样的,第三个scanf读取了b,第四个scanf读取了第二个回车符。第五个读取了c。所以五个scanf都执行了,并没有提前结束。只不过有的scanf读取到了回车符而已。 解决方法:把程序改成这样就可以了: for( i = 0; i < n; i++) { scanf(\"%c\ fflush(stdin);//刷新缓冲区 } 其中,scanf作为printf的参数,程序运行时先执行scanf,然后再由printf输出该scanf的返回值。 因篇幅问题不能全部显示,请点此查看更多更全内容