替代fflush(stdin)?

时间:2011-04-27 20:50:40

标签: c++

在C ++中是否真的需要fflush(stdin),这样做是否可以通过这种方式刷新缓冲区中的换行符?

3 个答案:

答案 0 :(得分:9)

fflush(stdin)的调用在C中是未定义的行为(并且,在C ++中是非常简单的。)

C语言标准,ISO 9899:1999声明 7.19.5.2/2

  

如果流指向输出流或最新的流更新流   如果没有输入操作,fflush函数会导致该流的任何未写入数据   要传递到主机环境以写入文件;否则,行为是   未定义

要将整个输入丢弃到下一行,在C ++中,最强大的方法是

std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

对于程序“闪烁和消失”,您是否可以在Windows平台上执行控制台应用程序?此类应用程序最好从控制台窗口(开始 - >运行 - > cmd.exe)

执行

答案 1 :(得分:4)

使用cin.get ()代替getchar (),您应该没问题。问题是C ++ I / O流和C I / O函数在相同的文件描述符之上工作,但具有不同的缓冲区。我无法确定w / o调试究竟发生了什么,但是感觉就像getchar()你要暂停程序直到输入字符才能获得已经被C ++输入流读取的字符。因此它获取数据并取消阻止,因此您退出程序。

如果仍有问题,请确保不输入“\ n”字符(即不要按Enter键)。因为输入后按Enter键实际上是一个你可以阅读的字符。这个问题通常通过偷看来解决(见http://www.cplusplus.com/reference/iostream/istream/peek/)。

答案 2 :(得分:0)

代码末尾的getchar()获取stdin中的下一个字符(输入缓冲区)。如果那里没有角色,那么它将等到用户输入内容。 fflush(stdin)清除输入缓冲区。

这就是为什么如果你有fflush你的代码会等待,因为你正在清除输入缓冲区,导致getchar等待用户的下一个输入。但是看起来你要在缓冲区上留下一些东西,导致getchar“搞定”它,结束你的程序。

如果您希望程序在完成后保持打开状态,请将冲洗保留在那里。如果您希望立即关闭,请移除冲洗。