如何刷新 cin 缓冲区?

发布于 2024-07-08 22:55:07 字数 27 浏览 10 评论 0原文

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

How do I clear the cin buffer in C++?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(14

烟柳画桥 2024-07-15 22:55:07

我更喜欢 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')

I would prefer the C++ size constraints over the C versions:

// 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')
情绪少女 2024-07-15 22:55:07

可能:

std::cin.ignore(INT_MAX);

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

另外:您可能想要执行以下操作: std: :cin.clear(); 在此之前也可以重置流状态。

Possibly:

std::cin.ignore(INT_MAX);

This would read in and ignore everything until EOF. (you can also supply a second argument which is the character to read until (ex: '\n' to ignore a single line).

Also: You probably want to do a: std::cin.clear(); before this too to reset the stream state.

撩心不撩汉 2024-07-15 22:55:07
cin.clear();
fflush(stdin);

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

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

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

This was the only thing that worked for me when reading from console. In every other case it would either read indefinitely due to lack of \n, or something would remain in the buffer.

EDIT:
I found out that the previous solution made things worse. THIS one however, works:

cin.getline(temp, STRLEN);
if (cin.fail()) {
    cin.clear();
    cin.ignore(numeric_limits<streamsize>::max(), '\n');
}
寄意 2024-07-15 22:55:07

我找到了两个解决方案。

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

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

...当输入流到达换行符时,它将丢弃输入流。 在此处了解有关此函数的更多信息。

另一种直接丢弃流的选项是……

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

祝你好运!

I have found two solutions to this.

The first, and simplest, is to use std::getline() for example:

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

... that will discard the input stream when it gets to a new-line. Read more about this function here.

Another option that directly discards the stream is this...

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

Good luck!

皇甫轩 2024-07-15 22:55:07
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";
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";
睡美人的小仙女 2024-07-15 22:55:07

怎么样:

cin.ignore(cin.rdbuf()->in_avail());

How about:

cin.ignore(cin.rdbuf()->in_avail());
浮光之海 2024-07-15 22:55:07

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

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

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

Another possible (manual) solution is

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

I cannot use fflush or cin.flush() with CLion so this came handy.

情绪操控生活 2024-07-15 22:55:07

我更喜欢:

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

I prefer:

cin.clear();
fflush(stdin);

There's an example where cin.ignore just doesn't cut it, but I can't think of it at the moment. It was a while ago when I needed to use it (with Mingw).

However, fflush(stdin) is undefined behavior according to the standard. fflush() is only meant for output streams. fflush(stdin) only seems to work as expected on Windows (with GCC and MS compilers at least) as an extension to the C standard.

So, if you use it, your code isn't going to be portable.

See Using fflush(stdin).

Also, see http://ubuntuforums.org/showpost.php?s=9129c7bd6e5c8fd67eb332126b59b54c&p=452568&postcount=1 for an alternative.

执手闯天涯 2024-07-15 22:55:07

最简单的方法:

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

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

Easiest way:

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

It just positions the cin pointer at the end of the stdin stream and cin.clear() clears all error flags such as the EOF flag.

岁月如刀 2024-07-15 22:55:07

这对我有用。 我已经将 for 循环与 getline() 一起使用。

cin.ignore()

It worked for me. I have used for loop with getline().

cin.ignore()
何其悲哀 2024-07-15 22:55:07

以下内容应该有效:

cin.flush();

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

cin.ignore(INT_MAX);

The following should work:

cin.flush();

On some systems it's not available and then you can use:

cin.ignore(INT_MAX);
小忆控 2024-07-15 22:55:07
#include <stdio_ext.h>

然后使用函数

__fpurge(stdin)
#include <stdio_ext.h>

and then use function

__fpurge(stdin)
会傲 2024-07-15 22:55:07

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

cin.get() seems to flush it automatically oddly enough (probably not preferred though, since this is confusing and probably temperamental).

我乃一代侩神 2024-07-15 22:55:07

fflush(stdin) - 用于清除输入缓冲存储器。 建议在写scanf语句之前使用。

fflush(stdout) - 用于清除输出缓冲存储器。 建议在 printf 语句之前使用。
以下应该有效:

cin.flush();
在某些系统上它不可用,然后您可以使用:

cin.ignore(INT_MAX);
Windows 和 Linux 都定义了 fflush() 在输入流上的行为,
甚至以同样的方式定义它(奇迹中的奇迹)。
fflush() 的 POSIX、C 和 C++ 标准没有定义该行为,
但它们都不能阻止系统定义它。
如果您正在编码以获得最大的可移植性,请避免使用 fflush(stdin);
如果您正在为定义行为的平台进行编码,请使用它 - 但请注意它不可移植
可移植代码不使用 fflush(stdin)。 与 Microsoft 平台相关的代码可以使用它并且
它可能会按预期工作,但要注意可移植性问题。

fflush(stdin) − It is used to clear the input buffer memory. It is recommended to use before writing scanf statement.

fflush(stdout) − It is used for clearing the output buffer memory. It is recommended to use before printf statement.
The following should work:

cin.flush();
On some systems it's not available and then you can use:

cin.ignore(INT_MAX);
Both Windows and Linux define the behaviour of fflush() on an input stream,
and even define it the same way (miracle of miracles).
The POSIX, C and C++ standards for fflush() do not define the behaviour,
but none of them prevent a system from defining it.
If you're coding for maximum portability, avoid fflush(stdin);
if you're coding for platforms that define the behaviour, use it — but be aware that it is not portable
portable code does not use fflush(stdin). Code that is tied to Microsoft's platform may use it and
it may work as expected, but beware of the portability issues.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文