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,移植性不好,反正上面的方法也不烦。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App