Chinaunix首页 | 论坛 | 博客
  • 博客访问: 427025
  • 博文数量: 177
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 20
  • 用 户 组: 普通用户
  • 注册时间: 2014-05-22 19:16
文章分类

全部博文(177)

文章存档

2017年(1)

2016年(12)

2015年(112)

2014年(52)

我的朋友

分类: C/C++

2015-05-18 11:35:59

        在学校时经常用fflush(stdin)它来刷新缓冲区,最近才发现这个函数的可移植行差,C99中定义,如果参数是一个文件指针,那么缓冲去内的内容马上会被写入到文件当中,但如果是标准输入,则行为是未定义的。

测试:

点击(此处)折叠或打开

  1. #include <stdio.h>

  2. int main(void)
  3. {
  4.     int i,num = -1;

  5.     for (i=0; i<10; i )
  6.     {
  7.          printf("input:");
  8.          scanf("%d" ,&num);
  9.          //fflush(stdin);
  10.          printf("num:%d\n" ,&num);
  11.          
  12.          num = -1;
  13.      }

  14.      return 0;
  15. }
     
        如果输入'a',那么马上打印10个东东,如果先输入一个整数,在输入一个字母,那么就在打印9个刚才输入的整数,另外有一点,加了fflush和没有加,结果是相同的,实验证明它并不能刷新缓冲区,另外如果缓冲区中有不匹配的数据,每次都会读到这个不匹配的数据。

        想要实现刷新缓冲区的功能,可以通过一下方式:

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. int main(void)
  3. {
  4.     int num,count;
  5.     int char_buf;
  6.     while (1) {
  7.         printf("num:");
  8.         count = scanf("%d" ,&num);

  9.         /*匹配失败,则scanf返回0*/
  10.         if (0 == count) {
  11.                 
  12.             /*
  13.              *当读到缓冲区内的数据为'\n'或EOF时完成读取
  14.              *'\n':行缓冲在缓冲区当中读到'\n'时进行实际的IO操作
  15.              * EOF:全缓冲在缓冲区当中读到末尾EOF时(缓冲区被填满)进行实际的IO操作
  16.              */
  17.             while ((char_buf=getchar())!='\n' && (char_buf!='EOF));
  18.         } else {
  19.             printf("num:%d\n",num);
  20.         }
  21.     }
  22.     return 0;
  23. }

       
        另外存在一个问题,上面是针对全缓冲和行缓冲,因为ISO规定输入缓冲是全缓冲,当设计终端设备时它是行缓冲的。那么如果将输入缓冲区关闭掉,那我们就不需要清空缓冲区了。但在代码中加入setbuf(stdin,NULL)时,并不能避免scanf重复的读数据。





阅读(882) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~