C++ 输入字符的int的cin会导致本应检查输入的循环失控

C++ 输入字符的int的cin会导致本应检查输入的循环失控,c++,char,int,buffer,cin,C++,Char,Int,Buffer,Cin,这是我的游戏的一个功能,它将要求输入并输入到“iAuswahl”! 然后while循环检查它是否是我想要的1-9值之一,如果不是,它将激活并请求新的输入。它对int有什么作用。 但是如果我输入一个像r这样的字符,它会变得疯狂,只会一直把cout还给我,跳过cin! 我的问题是它为什么这样做,我如何阻止它 void zug(string sSpieler, int iDran){ int iAuswahl; char cXO = 'O'; if (iDran == 1)

这是我的游戏的一个功能,它将要求输入并输入到“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);
}
void zug(字符串符号,int-iDran){
国际阿斯瓦尔;
char cXO='O';
如果(iDran==1)
{
cXO='X';
}

cout在读取错误的类型后,您需要清除错误标志,否则
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;
}
可以写成

if(iAuswahl < 1 || iAushwahl > 9)
if(iAuswahl<1 | | iAushwahl>9)

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

当从流中读取时发生错误,将设置错误标志,并且在清除错误标志之前无法再读取。这就是为什么您需要得到一个无限循环

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');
还有,我的天啊,这一行

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(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');
}
while(true)
{

如果((cin>>iAuswahl)&&(iAuswahl>=1)&&(iAuswahl如果您没有使用iAuswahl变量进行任何类型的数学运算,而您不在这个函数中,只需将变量设置为char变量,那么如果变量没有执行任何要求它为int的操作,那么就没有理由将变量设置为int。

可以使用cin.ignore()和cin.clear(),但我对输入的每个字符都进行了循环运行…猜测我需要SOME子句来忽略,但我是新手,所以如何将此cin.ignore(std::numeric_limits::max(),'\n')解析为适合我的代码。@JensKrüger您需要包含
,抱歉我忘了提到这一点。
cin.ignore()
一次只忽略一个字符。再次感谢您,但我似乎无法正确处理它……我希望限制是输入正确的长度?我该怎么做?如果我把它放得太长,它也会忽略下一个输入如果它太短,我会在循环中多次运行!@JensKrüger您打算一次键入几个数字吗?比如
2 4 7
?一次不能只输入一个数字,但如果有人输入“我讨厌这个游戏”之类的内容,如果我的限制设置错误,就会导致问题!
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');
}