前几天在网上看到一段代码,就把其中的一段给摘下来研究了一下。代码如下:
点击(此处)折叠或打开
- int a[10];
- for(i=0;i =<10,i++)
- scanf("%d",a[i]);
代码很简单,就是输入十个整型值赋给一个数组。但是我一不小心输了一个字符,最后这个循环就直接跳出了。我还以为这个程序有问题,所以我就写了另外一个小程序来验证。
点击(此处)折叠或打开
- #include <stdio.h>
- int main(void)
- {
- int a[10];
- int *p = NULL;
- p = a;
- int i,count=0;
- for(i = 0;i < 10;i++)
- //打印未给A赋值前的值,确定scanf函数是否起作用
- //实际上A是乱码,但是为了和后面值比较,所以将其打印
- {
- printf("pointer is : %d\n",p[i]);
- }
- for(i = 0;i < 10;i++)
- {
- count += (int) scanf("%d",&a[i]);
- }
- for(i = 0;i < 10;i ++)
- {
- printf("A%d:%d\n",i+1,a[i]);
-
- }
- printf("\nsuccess : %d\n",count);
- //打印scanf函数成功接收几个值
- return 0;
- }
最后的结果是第一次输入一个字符常量W就直接执行所有步骤。数组A[]所有值都未赋值,都为内存中的乱码,但是循环执行了10次。当时我就愣了,为什么scanf函数会一次都没有执行(count=0)?
我找到对scanf()函数描述:大致意思就是输入的常量先放到缓冲中,然后scanf()函数一个一个从buffer中读取。我的程序所出的问题就是这个字符常量W一直放在buffer中,十次循环scanf()一直就在读取这一个值,每读一次,scanf()函数就会与格式说明相比较,不符函数终止并返回0.这就是问题所在。
还有,有时候当我们利用scanf()函数输入一个常量时,我们再按下回车后这个回车就存在buffer中,如果下面还有scanf()就会出错。
解决的办法就是利用do,while解构消除回车;
这样就可以消除回车键对下面scanf()输入的影响了。
点击(此处)折叠或打开
- do
- {
- //program code
- }
- while(gechar() == '\n');
这样就可以消除回车键对下面scanf()输入的影响了。