如果在cpp中输入错误的数据类型,如何允许多个输入?

时间:2016-02-15 06:25:35

标签: c++

我有一个生成随机数的程序,并要求用户继续猜测,直到他/她做对了。我希望它继续接受新值,即使我通过处理错误情况错误地输入任何其他数据类型。

我的问题是,当我尝试运行以下程序时,一旦我输入一个字符并按下回车,它就会进入一个无限循环。我尝试使用cin.ignore()和cin.clear(),但这只是让程序在第一次输入后停止。

有谁能帮助我了解正在发生的事情以及如何实现所需的输出?提前谢谢。

#include <iostream>
#include <cstdlib>
#include <time.h>
using namespace std;

int main()
{
  int secret_num, guess;
  srand(time(NULL));
  secret_num=rand() %  101 + 0;
  cout<<"Enter your guess between 0 and 100: ";

do
 {
  if(!(cin>>guess))
  {
    cout<<" The entered value is not an integer"<<endl;
  }
  else if( isnumber(guess))
    {
      if(guess>secret_num)
        cout<<"Too high";
      else if(guess<secret_num)
        cout<<"too low";
    cout<<endl;
    }
 }
  while(secret_num!=guess);


  if((guess==secret_num)| (isnumber(guess)))
  {
    cout<<"yes the correct number is "<<secret_num<<endl;
  }

  return 0;
}

编辑:这是我输入字符后输入数字时cin.clear()和cin.ignore(1000,&#39; \ n&#39;)输出的截图两次。 enter image description here

4 个答案:

答案 0 :(得分:1)

    if (!(cin >> guess))
    {           
        cout << " The entered value is not an integer" << endl;
        cin.clear(); // clear must go before ignore

        // Otherwise ignore will fail (because the stream is still in a bad state)
        cin.ignore(std::numeric_limits<int>::max(), '\n'); 
    }

默认情况下,cin.ignore会忽略单个字符。如果他们输入超过1个字符,那就不够了,这就是为什么我对它进行了一些修改。

if ((guess == secret_num) | (isnumber(guess)))

|是一个按位运算符[OR]

||是逻辑运算符[OR]

但我认为你真正想要的是&&(AND)

if ((guess == secret_num) && (isnumber(guess)))

答案 1 :(得分:1)

有几个问题。

  1. 您应该使用@ {José建议的cin.clear()cin.ignore()

  2. 什么是isnumber()?我猜它正在返回false所以没有打印出提示消息(即“太高”和“太低”),看起来它停止了,虽然它只是在等待下一个输入。并isnumber()对我没有意义。 guess已被声明为int,它必须是一个数字,不是吗?

  3. 这里不需要
  4. if((guess==secret_num)| (isnumber(guess)))。在用户输入正确的数字之前,循环不会结束,这个条件应该已经得到满足。

答案 2 :(得分:0)

您可以使用clear和flush

  if(!(cin>>guess))
  {
    cout<<" The entered value is not an integer"<<endl;
    cin.clear();
    fflush(stdin);
  }

如果您正在从控制台阅读,则此功能正常。否则你可以和@José一起回答。

答案 3 :(得分:0)

我会改变循环中的逻辑,因为有一些无用的测试。这对我有用:

#include <iostream>
#include <limits>
#include <cstdlib> // You may take a look at <random> and <chrono>
#include <time.h>

using std::cout;
using std::cin;

int main() {

    srand(time(NULL));
    int secret_num = rand() %  101;
    cout << secret_num << '\n';
    cout << "Enter your guess between 0 and 100:\n";

    int guess = -1;
    do {
        cin >> guess;
        if ( cin.eof() ) 
            break;
        if ( cin.fail() ) {
            cout << "The entered value is not an integer, please retry.\n";
            // clear the error flag
            cin.clear();
            // ignore the rest of the line
            cin.ignore(std::numeric_limits<int>::max(),'\n');
            // clear the value of the variable
            guess = -1;
            continue;
        }
        // now we know that guess is a number
        if ( guess > secret_num )
            cout << "Too high\n";
        else if ( guess < secret_num )
            cout << "Too low\n";
        else {
            cout << "Yes the correct number is " << secret_num << std::endl;
            break;
        }
    } while ( true );

    return 0;
}