如何清除C ++中的cin缓冲区?
如何清除C ++中的cin缓冲区?
Answers:
可能:
std::cin.ignore(INT_MAX);
它将读入并忽略所有内容,直到EOF
。(您还可以提供第二个参数,该参数是要读取直到(例如:'\n'
忽略一行)的字符。
另外:您可能还想做一个:std::cin.clear();
在此之前重设流状态。
与C版本相比,我更喜欢C ++大小限制:
// Ignore to the end of file
cin.ignore(std::numeric_limits<std::streamsize>::max())
// Ignore to the end of line
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n')
cin
并使用上面的第一个语句来刷新cin
缓冲区,那么它会一直提示输入,直到我EOF
按进入ctrl+d
?
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.flush();
在某些系统上,它不可用,然后可以使用:
cin.ignore(INT_MAX);
flush
方法仅用于输出,并且处理已经写入的字符。
basic_istream<char>' has no member named 'flush'
cin.get()
似乎自动将其刷新得很奇怪(不过可能不是首选,因为这很容易混淆,而且可能很气质)。
它为我工作。我已经使用getline()进行循环。
cin.ignore()