为什么这个代码片段无限循环?(Why is this code snippet infinitely

2019-10-18 11:37发布

我是相当新的编程,我试图筛选从输入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

忽略“编译”,我有每个小实验块一个测试脚本给我节省时间,这是我多么崩溃他们时,他们不再有效。

我(等等)问题是,当我进入一个非整数,如f ,它具有无限循环"Error: Invalid. Try Again" ,我想不通为什么。 我想,也许因为input变得定义,有人跑过cin当谈到回到我的身边。 但我查了一个孤立的例子,和cin让我特别重新input ,然后再继续。

边栏:说到pragma ,没有任何人有这个在C ++更好的方法? 除了使个人的方法,因为大多数我的测试中可以只内运行main

编辑:我已经关掉cin.ignore(...)cin.clear()现在该程序可以正确地过滤输入; 但是现在,它不回送的。 给我后"Error: Invalid. Try again." ,它挂在它应该再问我进入整数。

Answer 1:

您原来的代码有两个问题(至少据我发现 - 不能保证不会有任何更多):

  1. 顺序cin.clear()cin.ignore() - cin.clear()应该是前cin.ignore()cin.ignore()不会做任何事情。
  2. 所述cin.ignore(numeric_limits<streamsize>::max()); 正在读直到分隔符,默认为EOF -换句话说,不管是在什么样缓冲输入,或进入后,它不断接受它。

要解决这两个问题使用此:

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

将读取到当前行,这可能是沿着你想要的线条更加的结束。

哦,变化:

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

至:

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


文章来源: Why is this code snippet infinitely looping?