如何刷新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标志。