如何在C ++中清除cin缓冲区?
答案 0 :(得分:106)
我更喜欢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')
答案 1 :(得分:90)
可能:
std::cin.ignore(INT_MAX);
这将读入并忽略所有内容,直到EOF
。 (你也可以提供第二个参数,这是要读取的字符(例如:'\n'
忽略一行)。
另外:您可能希望在此之前执行:std::cin.clear();
以重置流状态。
答案 2 :(得分:20)
cin.clear();
fflush(stdin);
这是从控制台阅读时唯一对我有用的东西。在其他每种情况下,由于缺少\ n,它会无限期地读取,或者某些东西会保留在缓冲区中。
编辑: 我发现之前的解决方案使事情变得更糟。然而,这个有效:
cin.getline(temp, STRLEN);
if (cin.fail()) {
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
}
答案 3 :(得分:7)
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";
答案 4 :(得分:7)
我找到了两个解决方案。
第一个也是最简单的是使用std::getline(std::cin, yourString);
例如:
#include <limits>
// Possibly some other code here
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
...当它到达换行符时将丢弃输入流。阅读有关此函数的更多信息here。
直接丢弃流的另一个选项是......
@keyframes slide-in {
from {left: -350px;}
to {left: 0;}
}
.how {
position: relative;
animation-name: slide-in;
animation-duration: 2s;
}
祝你好运!
答案 5 :(得分:3)
我更喜欢:
cin.clear();
fflush(stdin);
有一个例子,cin.ignore不会削减它,但我现在想不到它。不久之前我需要使用它(与Mingw一起)。
但是,根据标准,fflush(stdin)是未定义的行为。 fflush()仅适用于输出流。 fflush(stdin)似乎只能在Windows上运行(至少使用GCC和MS编译器)as an extension to the C standard。
因此,如果您使用它,您的代码将无法移植。
另外,请参阅http://ubuntuforums.org/showpost.php?s=9129c7bd6e5c8fd67eb332126b59b54c&p=452568&postcount=1以获取替代方案。
答案 6 :(得分:3)
怎么样:
cin.ignore(cin.rdbuf()->in_avail());
答案 7 :(得分:3)
另一种可能的(手动)解决方案是
cin.clear();
while (cin.get() != '\n')
{
continue;
}
我不能将fflush或cin.flush()与CLion一起使用,所以这很方便。
答案 8 :(得分:1)
以下内容应该有效:
cin.flush();
在某些系统上,它不可用,然后您可以使用:
cin.ignore(INT_MAX);
答案 9 :(得分:1)
#include <stdio_ext.h>
然后使用功能
__fpurge(stdin)
答案 10 :(得分:1)
最简单的方法:
cin.seekg(0,ios::end);
cin.clear();
它只是将cin指针放在stdin流的末尾,cin.clear()清除所有错误标志,例如EOF标志。
答案 11 :(得分:1)
对我有用。我用getline()进行循环。
cin.ignore()
答案 12 :(得分:0)
cin.get()
似乎自动奇怪地冲洗它(可能不是首选,因为这是令人困惑的,可能是气质的)。