C ++输入验证-输入字母时为什么返回0?

时间:2019-11-19 03:18:41

标签: c++ validation c++11 input

我目前有一个功能设置,该功能要求用户提供一个int,获取该int,然后检查以确保输入符合特定规范。在这种情况下,它期望输入将是介于-10和100之间的整数。到目前为止,如果我输入任何字母字符串E.G. “ gfUIWYDUF”,该函数返回0。为什么会发生这种情况以及如何解决?

int readUserInput() {

  cout << "What is the answer?: " << endl;

  int answer;

  do {
    cin >> answer;
    if (!cin || answer < -10 || answer > 100) {
      cout << "Invalid Input!" << endl;
      cout << "What is the answer?: " << endl;
      cin.clear();
      cin.ignore();
    }
  } while(!cin || answer < -10 || answer > 100);
  return answer;
}

3 个答案:

答案 0 :(得分:0)

如果使用输入值,您会发现cin >>从左到右扫描,直到找到任何非数字值。然后,它评估确实找到的数字。

例如,放:

57gh5

返回57

如果仅输入数字字符,则得分为0。

如果您改为cin >>字符串,则可以解析/验证字符串并将有效数字转换为整数

答案 1 :(得分:0)

问题是您对此类输入的验证循环取决于std::cin的错误状态。但是,您需要在循环检查之前清除该错误状态。

解决此问题的最简单方法是像这样将读数从std::cin移到clear()之后:

// Read first
cin >> answer;
do {

    if (!cin || answer < -10 || answer > 100) {
        cout << "Invalid Input!" << endl;
        cout << "What is the answer?: " << endl;
        cin.clear();
        cin.ignore();
        cin >> answer;
    }
} while(!cin || answer < -10 || answer > 100);

尽管如此,我认为我更喜欢使用常规的while循环:

cin >> answer;

while(!cin || answer < -10 || answer > 100) {
    cout << "Invalid Input!" << endl;
    cout << "What is the answer?: " << endl;
    cin.clear();
    cin.ignore();
    cin >> answer;

}

这对我来说比较干净,但这就是我。这两个循环都可以。

答案 2 :(得分:0)

返回

0作为 answer

的初始值

您可以使用cin.fail()来检查输入是否有效。

int readUserInput() {

  cout << "What is the answer?: " << endl;

  int answer;

  do {
    cin >> answer;
    if (cin.fail() || !cin || answer < -10 || answer > 100) {
      cout << "Invalid Input!" << endl;
      cout << "What is the answer?: " << endl;
      cin.clear();
      cin.ignore();
    }
  } while(cin.fail() || !cin || answer < -10 || answer > 100);
  return answer;
}