如何冲洗cin缓冲区?

时间:2008-11-02 17:31:59

标签: c++ cin io-buffering

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

13 个答案:

答案 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

因此,如果您使用它,您的代码将无法移植。

请参阅Using fflush(stdin)

另外,请参阅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()似乎自动奇怪地冲洗它(可能不是首选,因为这是令人困惑的,可能是气质的)。