如何清除 C++ 中的 cin 缓冲区?
13 回答
我更喜欢 C++ 的大小约束而不是 C 版本:
// Ignore to the end of file
std::cin.ignore(std::numeric_limits<std::streamsize>::max())
// Ignore to the end of line
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n')
可能:
std::cin.ignore(INT_MAX);
这将读入并忽略所有内容,直到EOF
. (您还可以提供第二个参数,它是要读取的字符(例如:'\n'
忽略单行)。
另外:您可能还想std::cin.clear();
在此之前执行:重置流状态。
cin.clear();
fflush(stdin);
这是从控制台阅读时唯一对我有用的东西。在所有其他情况下,它要么由于缺少 \n 而无限期地读取,要么会保留在缓冲区中。
编辑:我发现以前的解决方案让事情变得更糟。然而,这个有效:
cin.getline(temp, STRLEN);
if (cin.fail()) {
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
}
我找到了两种解决方案。
第一个也是最简单的,std::getline()
例如使用:
std::getline(std::cin, yourString);
...当它到达换行符时将丢弃输入流。在此处阅读有关此功能的更多信息。
直接丢弃流的另一个选项是...
#include <limits>
// Possibly some other code here
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
祝你好运!
int i;
cout << "Please enter an integer value: ";
// cin >> i; leaves '\n' among possible other junk in the buffer.
// '\n' also happens to be the default delim character for getline() below.
cin >> i;
if (cin.fail())
{
cout << "\ncin failed - substituting: i=1;\n\n";
i = 1;
}
cin.clear(); cin.ignore(INT_MAX,'\n');
cout << "The value you entered is: " << i << " and its double is " << i*2 << ".\n\n";
string myString;
cout << "What's your full name? (spaces inclded) \n";
getline (cin, myString);
cout << "\nHello '" << myString << "'.\n\n\n";
怎么样:
cin.ignore(cin.rdbuf()->in_avail());
我更喜欢:
cin.clear();
fflush(stdin);
有一个例子 cin.ignore 只是没有削减它,但我现在想不起来。不久前我需要使用它(与 Mingw 一起)。
但是,根据标准, fflush(stdin) 是未定义的行为。fflush() 仅用于输出流。fflush(stdin) 似乎只能在 Windows 上按预期工作(至少使用 GCC 和 MS 编译器)作为 C 标准的扩展。
因此,如果您使用它,您的代码将无法移植。
请参阅使用 fflush(stdin)。
另外,请参阅http://ubuntuforums.org/showpost.php?s=9129c7bd6e5c8fd67eb332126b59b54c&p=452568&postcount=1作为替代方案。
另一种可能的(手动)解决方案是
cin.clear();
while (cin.get() != '\n')
{
continue;
}
我不能将 fflush 或 cin.flush() 与 CLion 一起使用,所以这很方便。
最简单的方法:
cin.seekg(0,ios::end);
cin.clear();
它只是将 cin 指针定位在标准输入流的末尾,并且 cin.clear() 清除所有错误标志,例如 EOF 标志。
它对我有用。我已经使用 getline() 的 for 循环。
cin.ignore()
以下应该有效:
cin.flush();
在某些系统上它不可用,然后您可以使用:
cin.ignore(INT_MAX);
#include <stdio_ext.h>
然后使用函数
__fpurge(stdin)
cin.get()
似乎很奇怪地自动刷新它(但可能不是首选,因为这令人困惑并且可能是喜怒无常的)。