为什么这段代码片段无限循环?

时间:2013-08-08 17:05:59

标签: c++ while-loop infinite-loop cin

我对编程很新,我正在尝试过滤来自cin的输入(没有特别的原因;它是我现在知道的唯一输入方法),这样一个人只能输入1 -10并得到“积极”的回应。这是我的代码:

#pragma region Check cin is a valid input (an integer between 1 and 10, not a string or number out of range)
int input;
bool valid2=false;
    while (!valid2)
    {
        cout << "Enter an integer (1-10): ";
        cin >> input;
        if (!cin || input > 10 || input < 1)
        {
            cout << "Error: Invalid. Try again." << endl << endl;
            cin.ignore(numeric_limits<streamsize>::max());
            cin.clear();
        }
        else
        {
            valid2 = true;
        }
    }
#pragma endregion

忽略“pragma”,我为每个小实验都有一个带有块的测试脚本以节省时间,这就是我们在它们不再有效时将它们折叠的方式。

我的问题(除其他外)是当我输入一个非整数,例如f时,它会与"Error: Invalid. Try Again"无限循环,我无法弄清楚原因。我想也许自input被定义以来,当它回来时它已经超过了cin。但我检查了一个孤立的示例,cin让我在继续之前专门重新定义input

补充工具栏:说到pragma,有人在c ++中有更好的方法吗?除了制作单独的方法之外,因为我的大多数测试都可以在main内运行。

修改 我已切换cin.ignore(...)cin.clear(),现在程序可以正确过滤输入;但是现在,它根本没有回头。在给我"Error: Invalid. Try again."后,它会挂起 再次要求我输入整数的位置。

1 个答案:

答案 0 :(得分:2)

您的原始代码存在两个问题(至少在我发现的情况下 - 不保证不再存在):

  1. cin.clear()cin.ignore() - cin.clear()的顺序应该在cin.ignore()之前,或cin.ignore()将不执行任何操作。
  2. cin.ignore(numeric_limits<streamsize>::max());正在读取分隔符,默认为EOF - 换句话说,无论缓冲区中有什么输入,或者之后输入,它都会继续接受它。
  3. 要解决这两个问题,请使用此方法:

      cin.clear();
      cin.ignore(numeric_limits<streamsize>::max(), '\n');
    

    将读到当前行的结尾,这可能更符合您的要求。

    哦,改变:

        cin >> input;
        if (!cin || input > 10 || input < 1)
    

    为:

        if (!(cin >> input) || input > 10 || input < 1)