【问题标题】:cin for an int inputing a char causes Loop that is supposed to check input to go wildcin 用于输入 char 的 int 导致应该检查输入的循环变得疯狂
【发布时间】:2013-08-26 08:59:30
【问题描述】:

这是我的游戏的一个功能,它会要求输入和 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);
}

【问题讨论】:

    标签: c++ char int buffer cin


    【解决方案1】:

    读取错误类型后需要清除错误标志,否则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)
    

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

    【讨论】:

      【解决方案2】:

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

      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&gt;&gt; 来完成:

      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');
      }
      

      【讨论】:

      • 与 cin.ignore() 和 cin.clear() 一起工作很好,但我会通过循环输入每个字符...猜测我需要这样的 me 忽略子句,但我是新人为此,我如何将此 cin.ignore(std::numeric_limits<:streamsize>::max(), '\n') 解析为适合我的代码。
      • @JensKrüger 你需要包括&lt;limits&gt;,抱歉我忘了提。 cin.ignore() 一次只忽略一个字符。
      • 再次感谢,但我似乎无法正确处理......我希望限制是输入的长度,对吗?我怎么做?如果我把它放得太长,它也会忽略下一个输入,如果它太短,我会在循环中多次运行!
      • @JensKrüger 您打算一次输入多个数字吗?喜欢2 4 7
      • 一次只能输入一个数字,但如果有人输入诸如“我讨厌这个游戏”之类的内容,如果我的限制设置错误,就会导致问题!
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-03-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-03
        • 2017-06-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多