0

我对编程相当陌生,我正在尝试过滤输入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.",它挂在应该再次要求我输入整数的地方。

4

1 回答 1

2

您的原始代码有两个问题(至少据我所知 - 不保证不再存在):

  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)
于 2013-08-08T17:27:47.717 回答