C语言清空输入缓冲区 您所在的位置:网站首页 c语言怎么清除上一次的输入 C语言清空输入缓冲区

C语言清空输入缓冲区

2024-01-13 03:23| 来源: 网络整理| 查看: 265

先来看一段代码:

#include int main() { int num; char ch ; scanf("%d", &num); scanf("%c", &ch); printf("hello world\n"); system("pause"); return 0; }

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

1

a

hello world

但事实是下面的样子

1

hello world

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

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

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

下面是几种解决办法:

①解决办法一

#include int main() { int num; char ch ; scanf("%d", &num); setbuf(stdin, NULL);//使stdin输入流由默认缓冲区转为无缓冲区 scanf("%c", &ch); printf("hello world\n"); system("pause"); return 0; }

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

#include int main() { int num; char ch ; scanf("%d", &num); while ((c = getchar()) != EOF && c != '\n');//不停地使用getchar()获取缓冲中字符,直到获取的c是“\n”或文件结尾符EOF为止 scanf("%c", &ch); printf("hello world\n"); system("pause"); return 0; }

使用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,移植性不好,反正上面的方法也不烦。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有