Угадай число - бесконечный цикл при плохом чтении - PullRequest
0 голосов
/ 21 мая 2011

Итак, я делаю эту игру «Угадай число на С ++», которая выглядит следующим образом:

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

int main()
{
    srand(time(0));
    int secretNumber = rand() % 100 + 1; //Generate "Random number"
    int nbrOfGuesses = 0;
    int userInput;

    cout<<"\t************************************"<<endl;
    cout<<"\t*                                  *"<<endl;
    cout<<"\t*          Guess the number!       *"<<endl;
    cout<<"\t*                                  *"<<endl;
    cout<<"\t************************************"<<endl;
    cout<<endl;
    cout << "Try to find the secret int number: " << endl;

    //While input is good
    while(cin.good())
    {
        //Do this
        do {
            cin>>userInput;
            nbrOfGuesses++;

            if (userInput>secretNumber)
                cout << "Smaller!\n";

            else if(userInput<secretNumber)
                cout << "Bigger!\n"; // <-- Infinite loop here when you enter something other than an integer

            else //Also using this as a backup of (cin.good())
                cout << "Something went wrong with the read";
                break;

        } while(userInput!=secretNumber);
                cout << "\nCongratulations! You got it in " << nbrOfGuesses << " guesses\n";
    }

    system("pause");
    return 0;
}

* Извините, если код примечания очень элегантный

Как видите, кодотлично работает до тех пор, пока вы не введете случайный символ, такой как '&' или 'j', или что-нибудь еще, не являющееся целым числом ... Затем он зацикливается на cout << "Больше!"; </p>

Так что мой вопрос: Что вызывает это?

Ответы [ 3 ]

7 голосов
/ 21 мая 2011

Проверьте этот пост , это примерно такая же проблема. Подведем итог:

cin>>userInput;
if (cin.fail()) {
  cout<<"Invalid Entry, please try again."<<endl;
  cin.clear();
  cin.ignore(numeric_limits<streamsize>::max(), '\n');
}

Спасибо ildjarn за указание на пропущенное игнорирование, я пропустил эту часть, хотя она явно упоминается в посте, на который я ссылаюсь !!

2 голосов
0 голосов
/ 21 мая 2011

CIN >> UserInput;

Если он не может прочитать целое, для потока cin устанавливается плохой бит. Вы должны проверить и очистить послесловия.

if ( cin.fail() )
{
   cin.clear();
   try again
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...