循环重复而不再提示用户?

时间:2015-10-11 22:31:28

标签: c++ int

我从原始的长程序中获得了这段代码,尽管它看起来很简单,但它无法正常工作!我是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;
}

2 个答案:

答案 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;
}