我该如何在C++中清空cin缓冲区?
我更喜欢C++的尺寸限制,而不是C语言版本的:
// Ignore to the end of Stream
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();
以重置流状态。
EOF
(因为 INT_MAX
很大)。如帖子中所述,如果您只想忽略一行,您需要指定一个额外的参数 '\n'
,以告诉它您只想忽略到行末。 - Evan Terancin.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();
while (cin.get() != '\n')
{
continue;
}
我无法在CLion中使用fflush或cin.flush(),所以这很方便。
最简单的方法:
cin.seekg(0,ios::end);
cin.clear();
它只是将cin指针定位在stdin流的末尾,而cin.clear()则清除所有错误标志,例如EOF标志。
对我有用。我使用了带有getline()的for循环。
cin.ignore()
cin
并使用上面的第一条语句来刷新cin
缓冲区,那么它会不断提示输入,直到我通过按下ctrl+d
来输入EOF
? - ajay