我怎样冲洗这个缓冲液?

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

371784 次浏览

以下措施应该奏效:

cin.flush();

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

cin.ignore(INT_MAX);

有可能:

std::cin.ignore(INT_MAX);

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

另外: 您可能想做一个: std::cin.clear();之前,这也重置流状态。

与 C 版本相比,我更喜欢 C + + 的大小限制:

// Ignore to the end of Stream
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')

我更喜欢:

cin.clear();
fflush(stdin);

有一个例子,cin.Ignore 并不能解决这个问题,但是我现在想不出来。这是一段时间以前,当我需要使用它(与明格)。

不过,毛花(stdin)的未定义行为是根据标准。Fflush ()仅用于输出流。Fflush (stdin)似乎只能在 Windows 上正常工作(至少使用 GCC 和 MS 编译器)。

所以,如果你使用它,你的代码将不会是可移植的。

参见 使用 fflush (stdin)

另外,请参阅 http://ubuntuforums.org/showpost.php?s=9129c7bd6e5c8fd67eb332126b59b54c&p=452568&postcount=1以获得替代方案。

这个怎么样:

cin.ignore(cin.rdbuf()->in_avail());
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";
cin.clear();
fflush(stdin);

当我从控制台阅读时,这是唯一对我有效的方法。在其他任何情况下,它要么由于缺少 n 而无限期地读取,要么在缓冲区中保留一些内容。

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

cin.getline(temp, STRLEN);
if (cin.fail()) {
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
}
#include <stdio_ext.h>

然后使用函数

__fpurge(stdin)

cin.get()似乎自动冲洗它足够奇怪(可能不首选,因为这是令人困惑的,可能喜怒无常)。

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

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

我不能在 CLion 中使用 fflush 或 cin.rush () ,所以这很方便。

我找到了两个解决方案。

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

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

... 当输入流到达一个新行时,它将丢弃输入流。

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

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

祝你好运!

最简单的方法:

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

它只是将 cin 指针定位在 stdin 流的末尾,cin.clear ()清除所有错误标志,比如 EOF 标志。

我用过 getline ()的 for loop。

cin.ignore()

Fflush (stdin)-用于清除输入缓冲区内存。建议在编写 Scanf 语句之前使用。

Fflush (stdout)-用于清除输出缓冲区内存。建议在 printf 语句之前使用。 以下措施应该奏效:

冲洗() ; 在某些系统上它不可用,然后你可以使用:

忽略(INT _ MAX) ; Windows 和 Linux 都定义了 fflush ()在输入流上的行为, 甚至用同样的方式定义它(奇迹中的奇迹)。 用于 fflush ()的 POSIX、 C 和 C + + 标准没有定义这种行为, 但它们都不能阻止一个系统来定义它。 如果您正在编写最大可移植性的代码,请避免刷新(stdin) ; 如果您正在为定义行为的平台编写代码,请使用它ーー但要注意它是不可移植的 便携式代码不使用 fflush (stdin)。绑定到微软平台的代码可以使用它和 它可能会像预期的那样工作,但是要注意可移植性问题。