我目前有一个功能设置,该功能要求用户提供一个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;
}
答案 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;
}