0

我正在为 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,它甚至没有失败、清除和忽略功能的文档,所以我不完全理解他们。提前致谢!

4

1 回答 1

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>标题。

于 2013-05-24T03:23:22.763 回答