Пока продолжает повторять буквы, а не буквы # - PullRequest
3 голосов
/ 09 октября 2011

У меня есть цикл while, который принимает только 1 и 2 в качестве числа, если я вставлю и число, которое не является этим, мое предложение else будет продолжать запрашивать правильное, которое работает правильно. Но если я вставлю письмо, мое утверждение else зациклится навсегда. Как я могу это исправить?

#include <iostream>
using namespace std;

int main()
{
int myChoice;
cin >> myChoice;

while ( myChoice >= 2 ||  myChoice <= 1)
{
    if (myChoice == 1)
    {
        cout <<"food1";
        break;
    }
    else if (myChoice == 2)
    {
        cout <<"food2";
        break;
    }
    else
    {
        cout << " " << endl;
        cout << "Please select the proper choices" << endl;
        cout << "Try again: ";
        cin >> myChoice;
    }
}
return 0;
}

Ответы [ 3 ]

5 голосов
/ 09 октября 2011

Если вы введете не число, то cin >> myChoice завершится неудачно. Это означает, что он оставляет входные данные нетронутыми во входном буфере, и когда вы попадаете туда снова, он пытается их проанализировать и дает сбой и т. Д. Вы должны очистить состояние ошибки и игнорировать нецифровые символы. Самый простой способ - что-то вроде этого:

cout << "Try again: ";
cin.clear(); // clear error state
cin.ignore(std::numeric_limits<streamsize>::max(), '\n'); // ignore till the end of line
cin >> myChoice;
3 голосов
/ 09 октября 2011

Проблема здесь в том, что оператор cin >> ожидает получить вход int и получает вход char.

Модуль istream, экземпляром которого является cin,использует буферизованный ввод / вывод.Это означает, что пользовательский ввод сначала сохраняется в буфере, а затем считывается из этого буфера, когда пользовательская программа обращается к оператору >>.Обычно, если оператору >> удается прочитать и проанализировать введенные пользователем данные, считанные данные извлекаются из буфера, и следующий вызов оператора >> будет продолжен с того места, где остановился последний вызов.В вашем случае, однако, оператор >> пытается проанализировать ввод пользователя как число и завершается неудачей, поскольку он содержит недопустимые символы, которые не являются цифрами.Оператор >> в этом случае не извлекает прочитанные данные из буфера, и к этим же данным обращаются снова и снова при следующих вызовах оператора >>.

Вы должны очистить буферв случае неудачи, например, предложенный ybungalobill.

2 голосов
/ 09 октября 2011

Ваше while условие всегда true, затем вы используете break для выхода из цикла. Вы могли бы упростить вещи примерно так:

#include <iostream>
using namespace std;

int main()
{
  int myChoice;
  cin >> myChoice;

  while( myChoice != 1 || myChoice != 2 ) {
    cout << endl;
    cout << "Please select the proper choices" << endl;
    cout << "Try again: ";
    cin.clear();
    cin.ignore(std::numeric_limits<streamsize>::max(), '\n');
    cin >> myChoice;
  }

  // At this point myChoice is 1 or 2

  if (myChoice == 1)
    cout << "food1";
  else if (myChoice == 2)
      cout << "food2";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...