scanf函数缓冲区问题探究

本文通过一个简单的C语言程序示例,探讨了使用scanf函数时遇到的问题,特别是当输入包含非预期字符时的行为。文章解释了如何避免scanf函数因错误输入而提前终止,并提供了解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

点击(此处)折叠或打开

  1. int a[10];

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

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

点击(此处)折叠或打开

  1. #include <stdio.h>

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

  8.     for(= 0;< 10;i++) 
  9.     //打印未给A赋值前的值,确定scanf函数是否起作用
  10.     //实际上A是乱码,但是为了和后面值比较,所以将其打印
  11.     {
  12.         printf("pointer is : %d\n",p[i]);
  13.     }
  14.     for(= 0;< 10;i++)
  15.     {
  16.       count += (int) scanf("%d",&a[i]);
  17.       }
  18.      for(= 0;< 10;++)
  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()输入的影响了。
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值