scanf函数缓冲区问题探究

5421阅读 0评论2012-06-22 无赖皮肤
分类:C/C++

    前几天在网上看到一段代码,就把其中的一段给摘下来研究了一下。代码如下:
 

点击(此处)折叠或打开

  1. int a[10];

  2. for(i=0;i =<10,i++)
  3.  scanf("%d",a[i]);

    代码很简单,就是输入十个整型值赋给一个数组。但是我一不小心输了一个字符,最后这个循环就直接跳出了。我还以为这个程序有问题,所以我就写了另外一个小程序来验证。
 
 
 

点击(此处)折叠或打开

  1. #include <stdio.h>

  2. int main(void)
  3. {
  4.     int a[10];
  5.     int *p = NULL;
  6.     p = a;
  7.     int i,count=0;

  8.     for(i = 0;i < 10;i++)
  9.     //打印未给A赋值前的值,确定scanf函数是否起作用
  10.     //实际上A是乱码,但是为了和后面值比较,所以将其打印
  11.     {
  12.         printf("pointer is : %d\n",p[i]);
  13.     }
  14.     for(i = 0;i < 10;i++)
  15.     {
  16.       count += (int) scanf("%d",&a[i]);
  17.       }
  18.      for(i = 0;i < 10;i ++)
  19.      {
  20.          printf("A%d:%d\n",i+1,a[i]);
  21.   
  22.       }
  23.     printf("\nsuccess : %d\n",count);
  24.     //打印scanf函数成功接收几个值
  25.     return 0;

  26. }

 
    最后的结果是第一次输入一个字符常量W就直接执行所有步骤。数组A[]所有值都未赋值,都为内存中的乱码,但是循环执行了10次。当时我就愣了,为什么scanf函数会一次都没有执行(count=0)?

 
    我找到对scanf()函数描述:大致意思就是输入的常量先放到缓冲中,然后scanf()函数一个一个从buffer中读取。我的程序所出的问题就是这个字符常量W一直放在buffer中,十次循环scanf()一直就在读取这一个值,每读一次,scanf()函数就会与格式说明相比较,不符函数终止并返回0.这就是问题所在。

 
    还有,有时候当我们利用scanf()函数输入一个常量时,我们再按下回车后这个回车就存在buffer中,如果下面还有scanf()就会出错。
 
    解决的办法就是利用do,while解构消除回车;
 

点击(此处)折叠或打开

  1. do

  2. {
  3.         //program code
  4. }

  5. while(gechar() == '\n');


 
这样就可以消除回车键对下面scanf()输入的影响了。
 
上一篇:shell基础和简单入门
下一篇:C语言中定义与声明的区别