5

这是我的游戏的一个功能,它会要求输入和 cin 进入“iAuswahl”!然后while循环检查它是否是我想要1-9的值之一,如果不是,它会激活并且应该要求新的输入。女巫它为int做。但是,如果我输入一个像 r 这样的字符,它会发疯,然后继续给我我的 cout 并跳过 cin!我的问题是它为什么会这样做,我该如何阻止它?

void zug(string sSpieler, int iDran){
    int iAuswahl;
    char cXO = 'O';

    if (iDran == 1)
    {
        cXO = 'X';
    }

    cout << sSpieler << ", Sie sind am Zug. Bitte waehlen sie eins der Felder.\n" << endl;
    grafik();
    cout << "Sie sind >> " << cXO << " <<." << endl;
    cin >> iAuswahl;
    cout << endl;

    while ( 
        iAuswahl != 1 
        && iAuswahl != 2 
        && iAuswahl != 3 
        && iAuswahl != 4 
        && iAuswahl != 5 
        && iAuswahl != 6 
        && iAuswahl != 7
        && iAuswahl != 8 
        && iAuswahl != 9
    )
    {
        cout << "Kein gültiges Feld bitte wählen sie noch einmal!\n" << endl;
        cin >> iAuswahl;
    }
    feldfuellen(iAuswahl, cXO);
}
4

3 回答 3

5

从流中读取时发生错误时,会设置错误标志,并且在清除错误标志之前无法进行更多读取。这就是为什么你会得到一个无限循环。

cin.clear(); // clears the error flags
// this line discards all the input waiting in the stream
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

另外,如果一开始不知道读取是否成功,使用输入操作的结果也是错误的。您不能对 的值做出假设iAuswahl。这是新手使用流时最常犯的错误之一。经常检查输入操作是否正常。这很容易通过operator>>在布尔上下文中使用来完成:

if (cin >> some_obj) {
    // evaluates to true if it succeeded
} else {
    // something went wrong
}

而且,天哪,这条线

while (iAuswahl != 1 && iAuswahl != 2 && iAuswahl != 3 && iAuswahl != 4 && iAuswahl != 5 && iAuswahl != 6 && iAuswahl != 7 && iAuswahl != 8 && iAuswahl != 9)

可以是这样的:

while (iAuswahl < 1 || iAuswahl > 9)

正确的循环可能如下所示:

while (true)
{
    if ((cin >> iAuswahl) && (iAuswahl >= 1) && (iAuswahl <= 9)) break;
    std::cout << "error, try again\n";
    cin.clear();
    cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
于 2013-08-23T10:42:02.047 回答
3

读取错误类型后需要清除错误标志,否则cin将拒绝读取任何内容,因为它将处于无效状态。此外,您需要忽略未被 读取的那个字符cin,因为它会让您陷入永远循环,因为它总是会尝试从该字符读取。

while (iAuswahl != 1 && iAuswahl != 2 && iAuswahl != 3 && iAuswahl != 4 && iAuswahl != 5 && iAuswahl != 6 && iAuswahl != 7 && iAuswahl != 8 && iAuswahl != 9)
{
    cout << "Kein gültiges Feld bitte wählen sie noch einmal!\n" << endl;
    cin.clear();
    // #include <limits>
    cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    cin >> iAuswahl;
}

还,

while (iAuswahl != 1 && iAuswahl != 2 && iAuswahl != 3 && iAuswahl != 4 && iAuswahl != 5 && iAuswahl != 6 && iAuswahl != 7 && iAuswahl != 8 && iAuswahl != 9)

可以写成

if(iAuswahl < 1 || iAushwahl > 9)

不要忘记初始化iAushwahl0或其他值,因为如果cin >> iAushwahl失败,您将读取未初始化的变量。

于 2013-08-23T10:33:22.293 回答
0

如果您没有使用 iAuswahl 变量进行任何类型的数学运算,而您不在此函数中,只需将变量设为 char 变量,如果它没有做任何事情,则没有理由将变量设为 int要求它是一个int。

于 2019-02-03T00:49:33.450 回答