C语言缓冲区是个什么是环形缓冲区鬼

4529人阅读
先来看一段代码:
#include &stdio.h&
int main()
scanf("%d", &num);
scanf("%c", &ch);
printf("hello world\n");
system("pause");
设想输入一个数字和一个字母,应该出现如下情况
hello world
但事实是下面的样子
hello world
-----------------------------
原因是:在输入回车(‘\n’)时,相当于输入了一个字符,这样缓冲区内就残留了一个‘\n’。
再有就是我们使用scanf("%c", &ch);在中断接受一个字符,但若用户输入好几个字符,那么ch将只接受一个,而这时大量字符滞留在缓冲区内,下次再调用scanf时,还没有输入东西,缓冲区内的内容直接传到了scanf内,这样就造成了严重的错误。
下面是几种解决办法:
①解决办法一
#include &stdio.h&
int main()
scanf("%d", &num);
setbuf(stdin, NULL);//使stdin输入流由默认缓冲区转为无缓冲区
scanf("%c", &ch);
printf("hello world\n");
system("pause");
使用setbuf(stdin,null);可以使stdin输入流由默认缓冲区转为无缓冲区,这样scanf输入完毕后,缓冲区内的东西就消失了。
#include &stdio.h&
int main()
scanf("%d", &num);
while ((c = getchar()) != EOF && c != '\n');//不停地使用getchar()获取缓冲中字符,直到获取的c是“\n”或文件结尾符EOF为止
scanf("%c", &ch);
printf("hello world\n");
system("pause");
使用getchar不断获取缓冲区内的内容,直到缓冲区内空为止,这种方法很有效,建议使用,C primer 上也介绍了这种方法。
注意:有很多人可能觉得使用fflush(stdin);不就能清空缓冲区了,但使用这种方法有很多不确定性。
网上查了原因:C和C++的标准里从来没有定义过
fflush(stdin)。某些编译器(如VC6)支持用
fflush(stdin) 来清空输入缓冲,但是并非所有编译器都要支持这个功能(linux
下的 gcc 就不支持),//亲测确实如此在linux的gcc下不能清空缓冲区因为标准中根本没有定义
fflush(stdin)。
文档里 也清楚地写着fflush on
input stream is an extension to the C standard(fflush 操作输入流是对 C 标准的扩充)。当然,如果你毫不在乎程序的移植性,用
fflush(stdin) 也没什么大问题。
所以大家最好不要使用fflush,移植性不好,反正上面的方法也不烦。2被浏览182分享邀请回答0添加评论分享收藏感谢收起写回答C语言,将缓冲区内容即时写入文件
[问题点数:40分,结帖人dreamzen]
C语言,将缓冲区内容即时写入文件
[问题点数:40分,结帖人dreamzen]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
匿名用户不能发表回复!|C语言中输入缓冲区问题
[问题点数:20分,结帖人ch456hf]
C语言中输入缓冲区问题
[问题点数:20分,结帖人ch456hf]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2014年 总版技术专家分年内排行榜第二
2013年 总版技术专家分年内排行榜第三
2014年 总版技术专家分年内排行榜第二
2013年 总版技术专家分年内排行榜第三
2012年11月 Linux/Unix社区大版内专家分月排行榜第二2011年8月 Linux/Unix社区大版内专家分月排行榜第二2008年10月 C/C++大版内专家分月排行榜第二
2012年8月 Linux/Unix社区大版内专家分月排行榜第三
2012年1月 硬件/嵌入开发大版内专家分月排行榜第二2011年11月 硬件/嵌入开发大版内专家分月排行榜第二2011年10月 硬件/嵌入开发大版内专家分月排行榜第二2011年9月 硬件/嵌入开发大版内专家分月排行榜第二
2012年3月 硬件/嵌入开发大版内专家分月排行榜第三2012年2月 硬件/嵌入开发大版内专家分月排行榜第三
匿名用户不能发表回复!|C语言缓冲区是个什么鬼_百度知道
C语言缓冲区是个什么鬼
我有更好的答案
C语言缓冲区(缓存)详解 - CSDN博客
采纳率:71%
来自团队:
为您推荐:
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。

我要回帖

更多关于 什么是缓冲区 的文章

 

随机推荐