scanf函数缓冲区问题探究-凯发app官方网站

凯发app官方网站-凯发k8官网下载客户端中心 | | 凯发app官方网站-凯发k8官网下载客户端中心
  • 博客访问: 893509
  • 博文数量: 113
  • 博客积分: 3160
  • 博客等级: 少校
  • 技术积分: 1801
  • 用 户 组: 普通用户
  • 注册时间: 2011-08-19 10:09
文章分类

全部博文(113)

相关博文
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·

分类: c/c

2012-06-22 21:10:02

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

点击(此处)折叠或打开

  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",i1,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()输入的影响了。
 
阅读(5380) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
")); function link(t){ var href= $(t).attr('href'); href ="?url=" encodeuricomponent(location.href); $(t).attr('href',href); //setcookie("returnouturl", location.href, 60, "/"); }
网站地图