繁体   English   中英

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

[英]Why is this code snippet infinitely looping?

我对编程很新,而且我试图从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. 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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM