在学校时经常用fflush(stdin)它来刷新缓冲区,最近才发现这个函数的可移植行差,C99中定义,如果参数是一个文件指针,那么缓冲去内的内容马上会被写入到文件当中,但如果是标准输入,则行为是未定义的。
测试:
- #include <stdio.h>
- int main(void)
- {
- int i,num = -1;
- for (i=0; i<10; i )
- {
- printf("input:");
- scanf("%d" ,&num);
- //fflush(stdin);
- printf("num:%d\n" ,&num);
-
- num = -1;
- }
- return 0;
- }
如果输入'a',那么马上打印10个东东,如果先输入一个整数,在输入一个字母,那么就在打印9个刚才输入的整数,另外有一点,加了fflush和没有加,结果是相同的,实验证明它并不能刷新缓冲区,另外如果缓冲区中有不匹配的数据,每次都会读到这个不匹配的数据。
想要实现刷新缓冲区的功能,可以通过一下方式:
- #include <stdio.h>
- int main(void)
- {
- int num,count;
- int char_buf;
- while (1) {
- printf("num:");
- count = scanf("%d" ,&num);
- /*匹配失败,则scanf返回0*/
- if (0 == count) {
-
- /*
- *当读到缓冲区内的数据为'\n'或EOF时完成读取
- *'\n':行缓冲在缓冲区当中读到'\n'时进行实际的IO操作
- * EOF:全缓冲在缓冲区当中读到末尾EOF时(缓冲区被填满)进行实际的IO操作
- */
- while ((char_buf=getchar())!='\n' && (char_buf!='EOF));
- } else {
- printf("num:%d\n",num);
- }
- }
- return 0;
- }
另外存在一个问题,上面是针对全缓冲和行缓冲,因为ISO规定输入缓冲是全缓冲,当设计终端设备时它是行缓冲的。那么如果将输入缓冲区关闭掉,那我们就不需要清空缓冲区了。但在代码中加入setbuf(stdin,NULL)时,并不能避免scanf重复的读数据。
阅读(3733) | 评论(0) | 转发(1) |