cin for int输入一个char会导致应该检查输入的循环变为疯狂

Jen*_*ger 5 c++ int buffer cin char

这是我的游戏的功能,它会要求输入和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);
}
Run Code Online (Sandbox Code Playgroud)

jro*_*rok 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');
Run Code Online (Sandbox Code Playgroud)

另外,如果你不知道读取是否成功,那么使用输入操作的结果是错误的.你不能对价值做出假设iAuswahl.这是使用流的新手最常犯的错误之一.始终检查输入操作是否正常.这operator>>在布尔上下文中使用最容易完成:

if (cin >> some_obj) {
    // evaluates to true if it succeeded
} else {
    // something went wrong
}
Run Code Online (Sandbox Code Playgroud)

而且,我的哦,我的,这一行

while (iAuswahl != 1 && iAuswahl != 2 && iAuswahl != 3 && iAuswahl != 4 && iAuswahl != 5 && iAuswahl != 6 && iAuswahl != 7 && iAuswahl != 8 && iAuswahl != 9)
Run Code Online (Sandbox Code Playgroud)

可以就是这样:

while (iAuswahl < 1 || iAuswahl > 9)
Run Code Online (Sandbox Code Playgroud)

一个正确的循环可能看起来像这样:

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');
}
Run Code Online (Sandbox Code Playgroud)

  • @JensKrüger你需要包含"<limits>",对不起,我忘了提及.`cin.ignore()`一次只忽略一个字符. (2认同)