我正在为C ++课程制作游戏'Hex',并且无法理解如何确保cin正在读取正确的类型。我做了一些研究,我很接近,但这是我的问题:
int i, j;
while(true){
cin >> i;
if(cin.fail() ){ //if type wasn't right
cin.clear(); //clear stream
cin.ignore(); //ignore left over data
cout << "First value is invalid input! Valid coordinates are in range 0 to " << size - 1 << endl;
continue;
}
cin >> j;
if(cin.fail() ){ //if type wasn't right
cin.clear(); //clear stream
cin.ignore(); //ignore left over data
cout << "Second value is invalid input! Valid coordinates are in range 0 to " << size - 1 << endl;
continue;
}
if(i < 0 or i >= size or j < 0 or j >= size){
//prompt that input is wrong
cout << "Invalid input! Valid coordinates are in range 0 to " << size - 1 << endl;
continue;
}
那里有休息声明,确实没问题。我的问题是这样的运行:
Player 1's turn
Enter the row and column coordinate with only a space inbetween
a b
First value is invalid input! Valid coordinates are in range 0 to 10
First value is invalid input! Valid coordinates are in range 0 to 10
u 8
First value is invalid input! Valid coordinates are in range 0 to 10
8 u
它们都没有检测到第二个值是不正确的,当只有第二个值不正确时,它不会将其检测为错误。我查看了http://www.cplusplus.com/reference/iostream/cin/?kw=cin,它甚至没有关于fail,clear和ignore函数的文档,所以我不完全理解它们。提前谢谢!
答案 0 :(得分:1)
u 8
First value is invalid input! Valid coordinates are in range 0 to 10
8 u
由于cin >> i;
导致u
失败,因此重复循环,但只有cin
流中的第一个字符(空格)被cin.ignore();
消耗。当循环再次启动时,cin >> i;
将使用流中剩余的内容执行,在本例中为8
。这意味着在错误消息First value is invalid input! Valid coordinates are in range 0 to 10
之后,程序实际上正在等待cin >> j;
。输入8 u
后,它首先读取8
并将其值赋给j,这意味着没有失败。循环结束,u
留在流中。
要解决此问题,请按cin.ignore();
更改cin.ignore(numeric_limits<streamsize>::max(), '\n');
。它不会忽略下一个字符(在此示例中为空格),而是忽略该行的其余部分,从而有效地重置cin
流。您需要添加<limits>
标题。