如何刷新 cin 缓冲区?
如何清除 C++ 中的 cin 缓冲区?
How do I clear the cin buffer in C++?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
如何清除 C++ 中的 cin 缓冲区?
How do I clear the cin buffer in C++?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(14)
我更喜欢 C++ 大小限制而不是 C 版本:
I would prefer the C++ size constraints over the C versions:
可能:
这会读入并忽略一切,直到
EOF
。 (您还可以提供第二个参数,它是要读取的字符(例如:'\n'
忽略单行)。另外:您可能想要执行以下操作:
std: :cin.clear();
在此之前也可以重置流状态。Possibly:
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.这是从控制台读取时唯一对我有用的东西。 在所有其他情况下,它要么由于缺少 \n 而无限期地读取,要么某些内容会保留在缓冲区中。
编辑:
我发现之前的解决方案让事情变得更糟。 然而,这个有效:
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:
我找到了两个解决方案。
第一个也是最简单的方法是使用 std::getline() ,例如:
...当输入流到达换行符时,它将丢弃输入流。 在此处了解有关此函数的更多信息。
另一种直接丢弃流的选项是……
祝你好运!
I have found two solutions to this.
The first, and simplest, is to use
std::getline()
for example:... 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...
Good luck!
怎么样:
How about:
另一个可能的(手动)解决方案是
我不能将 fflush 或 cin.flush() 与 CLion 一起使用,所以这很方便。
Another possible (manual) solution is
I cannot use fflush or cin.flush() with CLion so this came handy.
我更喜欢:
有一个 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:
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.
最简单的方法:
它只是将 cin 指针定位在 stdin 流的末尾,并且 cin.clear() 清除所有错误标志,例如 EOF 标志。
Easiest way:
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.
这对我有用。 我已经将 for 循环与 getline() 一起使用。
It worked for me. I have used for loop with getline().
以下内容应该有效:
在某些系统上它不可用,然后您可以使用:
The following should work:
On some systems it's not available and then you can use:
然后使用函数
and then use function
cin.get() 似乎很奇怪地自动刷新它(但可能不是首选,因为这很令人困惑,而且可能很喜怒无常)。
cin.get()
seems to flush it automatically oddly enough (probably not preferred though, since this is confusing and probably temperamental).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.