如何刷新cin缓冲区?
如何清除C ++中的cin缓冲区?
可能是:
std::cin.ignore(INT_MAX);
这将读入并忽略一切,直到EOF
。 (你也可以提供第二个参数,它是要读取的字符(例如: '\n'
忽略一行)。
另外:你可能想要做一个: std::cin.clear();
在此之前也重置stream状态。
我更喜欢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.clear(); fflush(stdin);
这是从控制台读取的唯一工作。 在其他情况下,由于缺less\ n,它可能会无限期地读取,或者会留在缓冲区中。
编辑:我发现以前的解决scheme使事情变得更糟。 然而,这一个工作:
cin.getline(temp, STRLEN); if (cin.fail()) { 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";
我find了两个解决scheme。
第一个也是最简单的,就是使用std::getline()
,例如:
std::getline(std::cin, yourString);
…当它到达新行时将丢弃inputstream。 在这里阅读更多关于这个function。
直接丢弃stream的另一个选项是…
#include <limits> // Possibly some other code here cin.clear(); cin.ignore(numeric_limits<streamsize>::max(), '\n');
祝你好运!
怎么样:
cin.ignore(cin.rdbuf()->in_avail());
另一个可能的(手动)解决scheme是
cin.clear(); while (cin.get() != '\n') { continue; }
我不能在CLION上使用fflush或cin.flush(),所以这很方便。
我更喜欢:
cin.clear(); fflush(stdin);
有一个例子,cin.ignore只是不切,但我现在还想不起来。 当时我需要使用它(与Mingw一起)。
但是,根据标准,fflush(stdin)是未定义的行为。 fflush()仅用于输出stream。 fflush(stdin)只能在Windows上(至less使用GCC和MS编译器) 按预期工作,作为C标准的扩展 。
所以,如果你使用它,你的代码不会是可移植的。
请参阅使用fflush(stdin) 。
另外,请参阅http://ubuntuforums.org/showpost.php?s=9129c7bd6e5c8fd67eb332126b59b54c&p=452568&postcount=1 。
以下应该工作:
cin.flush();
在某些系统上,它不可用,然后你可以使用:
cin.ignore(INT_MAX);
#include <stdio_ext.h>
然后使用function
__fpurge(stdin)
cin.get()
似乎自动地刷新它(可能不是首选的,因为这是令人困惑,可能性情)。
最简单的方法:
cin.seekg(0,ios::end); cin.clear();
它只是将cin指针定位在标准inputstream的末尾,而cin.clear()则清除所有错误标志,如EOF标志。