从我所了解的来看,cin.clear()
重置标志位,但是它如何清空输入缓冲区呢?
cin.clear()
对输入缓冲区无影响。正如您正确读取的那样,它会重置标志(在技术上,用std::ios_base::goodbit
替换其当前值)。
cin >> 变量
后面使用 getline() 函数会被跳过吗?是因为 \n
吗? - Asif MushtaqEnter
按下来找到 '\n',所以它被执行/跳过了? - Asif Mushtaqstd::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()
字符。std::cin >> k; getline(std::cin,a);
其中k是一个整数..!! 我知道可以通过使用cin.ignore();
来修复它,但失败的原因是什么? - Asif Mushtaq\n
仍然会导致问题吗? - Asif Mushtaqcin.clear()不会清除缓冲区,它只会覆盖标志的当前值。如需更多详细信息,请访问此链接-->http://www.cplusplus.com/reference/ios/ios/clear/
您可以在此链接中找到一个很好的示例-->http://web.eecs.utk.edu/~plank/plank/classes/cs102/Cin-Notes/
实际上,cin.clear()
对输入缓冲区没有影响,它只是为流的内部错误状态标志设置了一个新值。
如果你想清除“打破”流的字符,你必须使用 cin.ignore()
(例如:cin.ignore(10000,'\n');
)
你可以在这里找到一个很好的解释和直观的例子:http://www.arachnoid.com/cpptutor/student1.html
cin.ignore(numeric_limits<streamsize>::max(), '\n')
。然而,它通常与cin.clear()
一起使用以完全重置cin。 - user5058091