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

C++ 循环重复而不再次提示用户?,c++,int,C++,Int,我有我原来的长程序中的代码片段,虽然看起来很简单,但它不能正常工作!我对C++语言是全新的,但我知道java是实现它的方法(不管语法)。 简单地说,这应该要求用户输入回答以下乘法(5*5),但是,它还应该检查用户是否输入了错误的输入(不是数字),不断地询问用户一次又一次。。。不知怎的,它一直在运行而不需要新的输入 我希望得到的,不仅是一个答案,而且是这样一个错误的原因 int main() { int userAnswer; bool isValidAnswer = true; c

我有我原来的长程序中的代码片段,虽然看起来很简单,但它不能正常工作!我对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;
}
intmain(){
int用户应答;
bool isValidAnswer=true;

您需要在接受新输入之前清除错误状态。在再次尝试读取输入之前,先调用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;
}
cout>number;
while(cin.fail())
{
cin.clear();
cin.ignore(1000,“\n”);//将有大量字符停在新行
数量;
}
首先,cin.fail()不会充分检查您的答案是否是自然数,或者类型是否设置为int(也可能是负数)

其次,您的布尔值
isValidAnswer
确实在检查它是否是无效答案

第三(也是最重要的),正如另一个答案所建议的,您应该输入cin.clear()以清除失败状态,然后输入cin.ignore(),这将从cin中删除失败的字符串

第四,cin将只检查字符串中是否存在int。您需要执行自己的字符串比较,以确定整个输入是否为int(请参阅下面基于答案的答案)

更新:

#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;
}
#包括
#包括
#包括
使用名称空间std;
bool isNum(字符串行)
{
char*p;
strtol(line.c_str(),&p,10);
返回*p==0;
}
int main(){
int用户应答;
字符串输入;
bool-isInvalidAnswer=true;

我可以尝试使用cin.clear()吗,但没有任何更改。您的代码也有同样的问题!!它从不排除新的输入,我一直按enter键而不结束循环!哎呀。它实际上需要是cin.ignore(1000,“\n”);您需要告诉它忽略新行。什么失败()和clear()确实是这样做的,所以它导致了这样一个问题?fail是一种检查cin是否失败的方法。它返回一个布尔值。Clear清除错误状态,以便您可以继续使用流。当cin失败时,错误输入留在流中,因此在清除错误状态后,您需要忽略错误输入。如果我这样做
123B会怎么样
,那么会发生什么?它是否会失败?