清除字符输入后面的回车, getchar(),scanf().输入时缓冲区中都会多一个回车。如何清楚缓冲区。

电子专业 徐 自远 568℃

文章1:http://bbs.csdn.net/topics/390471195

文章2:http://bbs.csdn.net/topics/300129123

文章3:http://blog.csdn.net/tw_345/article/details/49816231

getchar(),scanf().输入后如何立即清除缓冲区。
我在做一个菜单选项,一次只要求接受一个字符,可是用getchar()输入时,后面的回车被当作
第二次输入,还有如果一次输入很多字符,后面的字符也会带到下次循环。
请问在getchar()之后如何能立刻清除缓冲区。
我的环境时redhat linux 9.0.

方法1:

方法2:while(getchar()!=’\n’);★C51推荐

方法3:

 

用↓这个实现比较好点
while(getchar()!=’\n’);
fflush这个并不是c++的标准,有一些编译器并没有实现这个函数,可能用不了

案例分析:

有一天,一个普通的练习:

模拟购物商店,但是却发生了意想不到的事:

在前面的while语句中,出现了循环两次的情况。

仔细检查代码,并没有语法错误。

于是,我就回到寝室和小强(大牛)请教。

他也好久没碰c了,首先值得肯定的是,语法是没有问题。我们打了注释,发现和switch,printf,getchar,while这些都没关系,可以肯定的是问题还是出自scanf,我们将问题归结为可能是操作系统或是C语言的底层

我用的mac系统,是在Xcode上码的,我把代码发到他的VS上,期待的看着打印结果,~~却发现也有同样的问题。

于是我们加了C++的头文件,稍稍修改,发现果然C++并没有这个问题!

为了找出这个底层的原因,我们开始断点,发现,输入11之后,再次循环while时,scanf没有提示输入直接跳过,而此时ch由‘a’变成了‘\n’。正是因为这个‘\n’,使主菜单打印了两次

上网搜索这个换行符究竟什么来头,查到了“缓冲区”这个概念

并说及时刷新缓冲区可以解决这个问题

一种跨平台的方法 getchar()

如上,解决了那个的问题。

第二天,我想既然是c才会有的问题,我便翻开那本老朋友《C Primer Plus》

果然有谈到“缓冲区”!

上面谈到的知识点大致如下:

缓冲分为两类:完全缓冲和行缓冲。

对完全缓冲输入来说,缓冲区满时被清空。这总类型的缓冲通常出现在文件输入中。缓冲区的大小取决于系统,但512字节和4096字节是常见的值。

对行缓冲输入来说,遇到一个换行字符时被清空缓冲区。键盘输入是标准的行缓冲,因此按下回车键将清空缓冲区。

文件结尾(EOF)换行符(\n)

针对这个问题,书上的解决方案是

转载请注明:徐自远的乱七八糟小站 » 清除字符输入后面的回车, getchar(),scanf().输入时缓冲区中都会多一个回车。如何清楚缓冲区。

喜欢 (0)

苏ICP备18041234号-1 bei_an 苏公网安备 32021402001397号