C语言清空输入缓冲区

简介: 来源:http://blog.csdn.net/guanyasu/article/details/53153705https://zhidao.baidu.com/question/5241738.html C语言中如何清空输入输出缓冲区 上述描述似乎能够解决问题了,但是,fflush( )并不是标准C语言库函数,只是部分编译器自己实现的函数,是对标准C的扩展。

来源:http://blog.csdn.net/guanyasu/article/details/53153705

https://zhidao.baidu.com/question/5241738.html

 

C语言中如何清空输入输出缓冲区

 上述描述似乎能够解决问题了,但是,fflush( )并不是标准C语言库函数,只是部分编译器自己实现的函数,是对标准C的扩展。

 

 先来看一段代码: 

 1 #include <stdio.h>  
 2 int main()  
 3 {  
 4     int num;  
 5     char ch ;  
 6     scanf("%d", &num);  
 7     scanf("%c", &ch);  
 8     printf("hello world\n");  
 9     system("pause");  
10     return 0;  
11 }  

设想输入一个数字和一个字母,应该出现如下情况

1

a

hello world

但事实是下面的样子

1

hello world

-----------------------------

原因是:在输入回车(‘\n’)时,相当于输入了一个字符,这样缓冲区内就残留了一个‘\n’。

 

再有就是我们使用scanf("%c", &ch);在中断接受一个字符,但若用户输入好几个字符,那么ch将只接受一个,而这时大量字符滞留在缓冲区内,下次再调用scanf时,还没有输入东西,缓冲区内的内容直接传到了scanf内,这样就造成了严重的错误。

下面是几种解决办法:

①解决办法一

 使用setbuf(stdin,null);可以使stdin输入流由默认缓冲区转为无缓冲区,这样scanf输入完毕后,缓冲区内的东西就消失了。

 1 #include <stdio.h>  
 2 int main()  
 3 {  
 4     int num;  
 5     char ch ;  
 6     scanf("%d", &num);  
 7     setbuf(stdin, NULL);//使stdin输入流由默认缓冲区转为无缓冲区  
 8     scanf("%c", &ch);  
 9     printf("hello world\n");  
10     system("pause");  
11     return 0;  
12 }  

②解决方法二

 1 #include <stdio.h>  
 2 int main()  
 3 {  
 4     int num;  
 5     char ch ;  
 6     scanf("%d", &num);  
 7     while ((c = getchar()) != EOF && c != '\n');//不停地使用getchar()获取缓冲中字符,直到获取的c是“\n”或文件结尾符EOF为止  
 8     scanf("%c", &ch);  
 9     printf("hello world\n");  
10     system("pause");  
11     return 0;  
12 }  

使用getchar不断获取缓冲区内的内容,直到缓冲区内空为止,这种方法很有效,建议使用,C primer 上也介绍了这种方法。

 

注意:有很多人可能觉得使用fflush(stdin);不就能清空缓冲区了,但使用这种方法有很多不确定性。

网上查了原因:C和C++的标准里从来没有定义过 fflush(stdin)。
某些编译器(如VC6)支持用 fflush(stdin) 来清空输入缓冲,
但是并非所有编译器都要支持这个功能(Linux 下的 gcc 就不支持),//亲测确实如此在linux的gcc下不能清空缓冲区
因为标准中根本没有定义 fflush(stdin)。

MSDN 文档里 也清楚地写着
fflush on input stream is an extension to the C standard(fflush 操作输入流是对 C 标准的扩充)。
当然,如果你毫不在乎程序的移植性,用 fflush(stdin) 也没什么大问题。

所以大家最好不要使用fflush,移植性不好,反正上面的方法也不烦。

 

  

 

相关文章
|
5月前
|
编译器 C语言
【C语言航路外传】输入输出函数及输入缓冲区的那点事
【C语言航路外传】输入输出函数及输入缓冲区的那点事
27 0
|
10月前
|
存储 缓存 C语言
【C语言进阶】文件的顺序读写、随机读写、文本文件和二进制文件、文件读取结束的判定以及文件缓冲区相关知识(下)
【C语言进阶】文件的顺序读写、随机读写、文本文件和二进制文件、文件读取结束的判定以及文件缓冲区相关知识(下)
|
10月前
|
存储 C语言
【C语言进阶】文件的顺序读写、随机读写、文本文件和二进制文件、文件读取结束的判定以及文件缓冲区相关知识(中)
【C语言进阶】文件的顺序读写、随机读写、文本文件和二进制文件、文件读取结束的判定以及文件缓冲区相关知识(中)
|
10月前
|
编译器 数据库 C语言
【C语言进阶】文件的顺序读写、随机读写、文本文件和二进制文件、文件读取结束的判定以及文件缓冲区相关知识(上)
【C语言进阶】文件的顺序读写、随机读写、文本文件和二进制文件、文件读取结束的判定以及文件缓冲区相关知识(上)
|
11月前
|
存储 缓存 算法
【C语言拓展】缓冲区、结构体大小计算、命令行参数
【C语言拓展】缓冲区、结构体大小计算、命令行参数
117 0
|
机器人 Linux C语言
C语言, C++ IO 总结. 一篇文章帮你透析缓冲区存在的意义, C, C++ IO的常见用法
C语言, C++ IO 总结. 一篇文章帮你透析缓冲区存在的意义, C, C++ IO的常见用法
C语言, C++ IO 总结. 一篇文章帮你透析缓冲区存在的意义, C, C++ IO的常见用法
|
C语言
C语言——getchar()函数缓冲区
C语言——getchar()函数缓冲区
195 0
C语言——getchar()函数缓冲区
|
C语言 编译器 安全
C语言清空输入缓冲区的N种方法对比【转】
转自:http://www.cnblogs.com/codingmylife/archive/2010/04/18/1714954.html C语言中有几个基本输入函数: //获取字符系列 int fgetc(FILE *stream); int getc(FILE *stream); int getchar(void); //获取行系列 char *fgets(char * restrict s, int n, FILE * restrict stream); char *gets(char *s);//可能导致溢出,用fgets代替之。
861 0
|
Linux 测试技术 C语言
C语言编程 - 清空键盘缓冲区
本文来源:CSDN博客,连接:http://blog.csdn.net/dragonszy/article/details/8441532 清空键盘缓冲区很多种方法,如用fflush(stdin); rewind(stdin);等,但是在linux这些都不起作用,还得我今天试了半天都没成功,上网搜了一下发现setbuf(stdin, NULL);就能直接清空键盘缓冲区了。
1292 0