我从原始的长程序中获得了这段代码,尽管它看起来很简单,但它无法正常工作!我是c ++语言的新手,但我知道在Java中可以做到这一点(无论语法如何)。
简单地说,这应该要求用户输入以回答以下乘法(5 * 5),但是,它还应该检查用户是否输入了错误的输入(不是数字),不断询问用户......不知怎的,它不停地运行而不需要新的输入!!
我希望得到的不仅是答案,还有这样一个错误的原因!
int main() {
int userAnswer;
bool isValidAnswer = true;
cout << 5 << " * " << 5 << " = ";
cin >> userAnswer;
cin.ignore();
do {
if (cin.fail()) { //user input is not an integer
cout << "Your answer is not valid! Please enter only a natural number: ";
cin >> userAnswer;
cin.ignore();
} else {
isValidAnswer = false;
}
} while (isValidAnswer);
return 0;
}
答案 0 :(得分:2)
您需要在接受新输入之前清除错误状态。在尝试再次读取输入之前,先调用cin.clear()然后调用cin.ignore()。
我会做类似的事情。
cout << "Enter a number: ";
cin >> number;
while(cin.fail())
{
cin.clear();
cin.ignore(1000, '\n'); //some large number of character will stop at new line
cout << "Bad Number Try Again: ";
cin >> number;
}
答案 1 :(得分:0)
首先,cin.fail()不会充分检查你的答案是否是自然数,类型设置为int(也可能是负数)。
其次,你的布尔isValidAnswer
确实在检查它是否是无效答案。
第三(也是最重要的),如另一个答案所示,你应该放入cin.clear()来清除失败状态,然后是cin.ignore(),它将从cin中删除失败的字符串。 / p>
第四,cin只会检查字符串中是否存在int。您需要执行自己的字符串比较以确定整个输入是否为int(请参阅下面的答案,基于this答案)。
更新:
#include <iostream>
#include <string>
#include <cstdlib>
using namespace std;
bool isNum(string line)
{
char* p;
strtol(line.c_str(), &p, 10);
return *p == 0;
}
int main() {
int userAnswer;
string input;
bool isInvalidAnswer = true;
cout << 5 << " * " << 5 << " = ";
while (isInvalidAnswer) {
if (!(cin >> input) || !isNum(input)) {
cout << "Answer is not a number! Please try again:\n";
cin.clear();
cin.ignore();
}
else {
userAnswer = atoi(input.c_str());
if (userAnswer < 0) { //user input is not an integer
cout << "Answer is not a natural number! Please try again:\n";
} else {
isInvalidAnswer = false;
}
}
}
cout << "Question answered!\n";
return 0;
}