如何清空cin缓冲区(包括所有换行符)
嗨,我完全懂你碰到的这个坑——程序在显示进度条“思考”的时候,要是用户提前按了回车,后面的getchar()直接就触发退出了,根本没等用户再按一次回车对吧?这问题根源就是输入缓冲区里还留着之前按下回车产生的换行符,getchar()一读到它就直接返回了,自然不会等新的输入。
给你几个靠谱的解决办法:
最推荐的通用方法:用
cin.ignore()配合数值上限清空缓冲区
这个方法能一次性清空缓冲区里从当前位置开始,直到遇到换行符(连换行符本身也一起清掉)的所有字符,不管用户提前按了多少次回车或者输入了其他内容都管用。不过要记得包含<limits>头文件来用numeric_limits。代码示例:
#include <iostream> #include <limits> // 必须包含这个头文件 // 在进度条结束、调用getchar()之前,插入这段代码清空缓冲区 std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); getchar();解释下:
std::numeric_limits<std::streamsize>::max()表示取输入流能容纳的最大字符数,这样就能确保把缓冲区里所有残留的字符都忽略掉,直到碰到换行符为止——刚好把用户提前输入的内容全清干净,让后面的getchar()能老老实实等用户新的回车。备选方法:同步并刷新缓冲区(谨慎使用)
如果你是混合使用cin和C语言的输入函数(比如getchar()),有时候会因为C++和C的输入流不同步导致缓冲区混乱,这时候可以先调用std::cin.sync()来同步并刷新缓冲区:std::cin.sync(); getchar();不过要注意,
sync()的行为在不同编译器上可能不太一致,有些情况下它可能不会清空所有字符,所以还是第一种方法更稳妥。
另外要提醒你,一定要把清空缓冲区的代码放在进度条结束之后、getchar()之前,这样才能确保残留的输入被清理掉,让程序按预期等待用户的新回车。
备注:内容来源于stack exchange,提问作者Greg

