124

如何清除 C++ 中的 cin 缓冲区?

4

13 回答 13

131

我更喜欢 C++ 的大小约束而不是 C 版本:

// Ignore to the end of file
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')
于 2008-11-02T18:34:19.930 回答
109

可能:

std::cin.ignore(INT_MAX);

这将读入并忽略所有内容,直到EOF. (您还可以提供第二个参数,它是要读取的字符(例如:'\n'忽略单行)。

另外:您可能还想std::cin.clear();在此之前执行:重置流状态。

于 2008-11-02T17:37:55.347 回答
30
cin.clear();
fflush(stdin);

这是从控制台阅读时唯一对我有用的东西。在所有其他情况下,它要么由于缺少 \n 而无限期地读取,要么会保留在缓冲区中。

编辑:我发现以前的解决方案让事情变得更糟。然而,这个有效:

cin.getline(temp, STRLEN);
if (cin.fail()) {
    cin.clear();
    cin.ignore(numeric_limits<streamsize>::max(), '\n');
}
于 2014-05-19T18:47:24.777 回答
16

我找到了两种解决方案。

第一个也是最简单的,std::getline()例如使用:

std::getline(std::cin, yourString);

...当它到达换行符时将丢弃输入流。在此处阅读有关此功能的更多信息。

直接丢弃流的另一个选项是...

#include <limits>
// Possibly some other code here
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');

祝你好运!

于 2015-12-29T20:50:59.237 回答
11
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";
于 2009-10-09T09:26:06.807 回答
6

怎么样:

cin.ignore(cin.rdbuf()->in_avail());
于 2009-02-11T20:30:29.077 回答
4

我更喜欢:

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作为替代方案。

于 2008-11-02T18:55:44.330 回答
4

另一种可能的(手动)解决方案是

cin.clear();
while (cin.get() != '\n') 
{
    continue;
}

我不能将 fflush 或 cin.flush() 与 CLion 一起使用,所以这很方便。

于 2015-08-07T08:15:48.547 回答
4

最简单的方法:

cin.seekg(0,ios::end);
cin.clear();

它只是将 cin 指针定位在标准输入流的末尾,并且 cin.clear() 清除所有错误标志,例如 EOF 标志。

于 2017-09-25T17:45:29.373 回答
3

它对我有用。我已经使用 getline() 的 for 循环。

cin.ignore()
于 2020-05-19T15:27:10.200 回答
1

以下应该有效:

cin.flush();

在某些系统上它不可用,然后您可以使用:

cin.ignore(INT_MAX);
于 2008-11-02T17:34:44.790 回答
1
#include <stdio_ext.h>

然后使用函数

__fpurge(stdin)
于 2014-11-08T12:47:35.557 回答
0

cin.get()似乎很奇怪地自动刷新它(但可能不是首选,因为这令人困惑并且可能是喜怒无常的)。

于 2015-03-19T21:38:44.077 回答