我从https://en.cppreference.com/w/cpp/io/basic_ios/clear阅读了示例代码并尝试了此操作:
命令行输入为:w
#include <iostream>
#include <string>
int main()
{
double n = 5.0;
std::cin >> n;
std::cout << std::cin.bad() << "|" << std::cin.fail() << "\n";
std::cout << "hello" << "\n";
std::cin.clear();
std::cout << std::cin.bad() << "|" << std::cin.fail() << "\n";
std::cin >> n; //Why can't I input again here?
std::cout << "world" << "\n";
std::cout << n << "\n";
}
我不明白为什么在不让我再次输入的情况下程序会完成,我想我已经使用std::cin.clear()
来重置所有“失败”状态。
答案 0 :(得分:4)
clear
只是重置错误标志,但是它将导致失败的先前输入保留在缓冲区中。因此,第二个cin >> n
将再次读取相同的输入,并且将再次失败。因此,您将没有机会输入新的输入内容。
您需要从缓冲区中提取错误的字符(除了调用cin.clear()
之外);例如,使用cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n')
,它将忽略每个字符,直到\n
首次出现。您也可以使用fgets
,但是-与ignore
相比,-fgets
需要一个缓冲区来存储您实际上不感兴趣的字符。