int x; // intitialize x but don't immediately prompt for input. This makes the program more user friendly
cout << "Enter a year to check if it's a leap year: " << endl;
cin >> x;
while (cin.fail()) // check for input error
{
cin.clear();
cin.ignore();
cout << "You entered an incorrect value. Try again" << endl;
cin >> x;
}
我无法理解失败状态在c ++中是如何工作的。我想要发生的是如果用户输入除了数字之外的任何东西,它将清除缓冲区并提示另一个输入。我的代码似乎不是那样做的。如果我输入像say,r4这样的东西,那么我的其余代码(工作正常,所以我没有在下面显示)将运行四个。似乎循环在某个时刻被激活。 cout字符串仍然打印出来。只是它没有给我机会重新输入和继续检查。
答案 0 :(得分:2)
从http://en.cppreference.com/w/cpp/io/basic_ios/fail获取的下表显示了影响istream::fail()
鉴于此,您应该使用:
while (cin.fail()) // check for input error
{
if ( cin.eof() )
{
// Once EOF file has been reached with cin,
// you can't do much. Figure out a way to bail
// from the loop.
}
cin.clear();
// Also, ignore not just one character but till the end of the line.
// cin.ignore();
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
cout << "You entered an incorrect value. Try again" << endl;
cin >> x;
}
答案 1 :(得分:0)
cin >> x;
cin
检查缓冲区中是否有任何内容。缓冲区为空,因此它等待用户按下return,然后将所有内容复制到缓冲区(r4
)。然后它尝试从缓冲区加载到int
。第一个字节是r
,因此它设置流的failstate并中止。 r4
仍留在缓冲区中。
cin.clear();
这会清除故障状态,r4
仍保留在缓冲区中。
cin.ignore();
这会忽略缓冲区中的第一个字符。 4
仍留在缓冲区中。
cout << "You entered an incorrect value. Try again" << endl;
cin >> x;
cin
检查缓冲区中是否有任何内容,并且(4
),因此它会尝试从缓冲区加载到int
,如你所见,成功并继续。
通常的解决方案是使用cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n')
,忽略该行的其余部分。
答案 2 :(得分:-1)
cin.good()
或cin.fail()
会告诉您是否可以处理输入(有效)。cin.clear()
会在需要时清除错误状态。