cin.clear()如何清空输入缓冲区?

4

从我所了解的来看,cin.clear() 重置标志位,但是它如何清空输入缓冲区呢?


我认为清空输入缓冲区的方法是cin.ignore(numeric_limits<streamsize>::max(), '\n')。然而,它通常与cin.clear()一起使用以完全重置cin。 - user5058091
4个回答

3

cin.clear()对输入缓冲区无影响。正如您正确读取的那样,它会重置标志(在技术上,用std::ios_base::goodbit替换其当前值)。


你能解释一下为什么在 cin >> 变量 后面使用 getline() 函数会被跳过吗?是因为 \n 吗? - Asif Mushtaq
@UnKnown 它并不是“跳过”,它恰好做它设计的事情。请参见此处的注释部分:http://en.cppreference.com/w/cpp/string/basic_string/getline#Notes - Cubbi
这段程序相关的内容翻译为:它被设计为读取字符串,直到找到 '\n',因为它通过最后一次 Enter 按下来找到 '\n',所以它被执行/跳过了? - Asif Mushtaq

2

std::ios::clear()只会在可能的情况下重置错误标志。例如,如果没有流缓冲区(即stream.rdbuf()返回nullptr),则std::ios_base::badbit仍然会保持设置状态。这是唯一的影响。特别地,std::ios_base::clear()不会从输入缓冲区中删除任何字符。

如果您需要从输入缓冲区中删除字符,您需要明确执行该操作。例如,您可以使用以下方法:

  • stream.ignore();来无条件地删除下一个字符(如果有的话;如果没有,流将设置std::ios_base::eofbit)。
  • stream.ignore(std::numeric_limits<std::streamsize>::max(), '\n');以删除所有字符,直到遇到第一个'\n'字符(包括该字符)。
  • stream.peek()返回的字符类不符合要求时(例如,当isdigit(stream.peek())返回false时),您可能想要在ignore()字符。

为什么getline()在这里跳过了?std::cin >> k; getline(std::cin,a);其中k是一个整数..!! 我知道可以通过使用cin.ignore();来修复它,但失败的原因是什么? - Asif Mushtaq
@Unknown:这个问题之前已经被问过并且有很多次回答(我知道因为我已经回答过多次了):请学会如何在Stackoverflow上搜索! - Dietmar Kühl
抱歉,我忘记添加了。如果k是整数,那么\n仍然会导致问题吗? - Asif Mushtaq
@Unknown:寻找问题的答案,理解它,你就能回答自己的问题了! - Dietmar Kühl

1

1

实际上,cin.clear() 对输入缓冲区没有影响,它只是为流的内部错误状态标志设置了一个新值。

如果你想清除“打破”流的字符,你必须使用 cin.ignore()(例如:cin.ignore(10000,'\n');

你可以在这里找到一个很好的解释和直观的例子:http://www.arachnoid.com/cpptutor/student1.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接