Попытка использовать оператор while для проверки пользовательского ввода C ++ - PullRequest
2 голосов
/ 28 августа 2010

Я новичок в C ++ и учусь в классе. Я пытаюсь завершить первый проект, и пока у меня все работает правильно, однако мне нужно, чтобы пользователь ввел число, чтобы выбрать свой уровень, и хотел бы подтвердить, что это число, а число не слишком большой.

while(levelChoose > 10 || isalpha(levelChoose))
{
    cout << "That is not a valid level" << endl;
    cout << "Choose another level:";
    cin >> levelChoose;
}

Это цикл, который я сделал, и он иногда работает. Если я наберу 11, это напечатает ошибку и позволит мне выбрать другой уровень. Однако, если число большое или любой альфа-символ, оно заполняет экран кушетками, и цикл не заканчивается, и я вынужден принудительно выйти. Почему он иногда останавливается у cin и ждет ввода пользователя, а иногда нет? Спасибо за помощь!

Ответы [ 4 ]

3 голосов
/ 28 августа 2010

Это раздражающая проблема с cin (и istreams в целом). cin безопасен от типа, поэтому, если вы укажете неправильный тип, он потерпит неудачу. Как вы сказали, ввод большого числа или нечислового числа застревает в бесконечном цикле. Это потому, что они несовместимы с типом levelChoose. cin терпит неудачу, но буфер все еще заполнен введенным вами текстом, поэтому cin продолжает пытаться его прочитать. Вы попадаете в бесконечный цикл.

Чтобы исправить это, вам нужно очистить бит сбоя и игнорировать все символы в буфере. Код ниже должен сделать это (хотя я не проверял это):

while(levelChoose > 10 || isalpha(levelChoose))
{
    cout << "That is not a valid level" << endl;
    cout << "Choose another level:";
    if(!(cin >> levelChoose))
    {
        cin.clear();
        cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    }
}

Редактировать: numeric_limits <> находится в следующих пределах:

#include<limits>
2 голосов
/ 28 августа 2010

Из вашего описания представляется вероятным (почти наверняка), что levelChose является своего рода числовым типом, возможно, целым числом.

Когда вы используете operator>> для чтения числа, все, что не может быть частью числа (например, большинство букв), останется во входном буфере. Происходит то, что вы пытаетесь прочитать число, оно терпит неудачу и оставляет нецифровую в буфере, распечатывает сообщение об ошибке, а затем снова пытается прочитать точно такую ​​же нецифровую из буфера.

Обычно, когда такой ввод не выполняется, вы хотите сделать что-то вроде игнорирования всего во входном буфере до следующей новой строки.

0 голосов
/ 28 августа 2010

Я подозреваю, что часть while(levelChoose > 10 ..... Это не ограничивает уровень менее 10 (если в вашем контексте больше 10, это большое число). Вместо этого вероятно должно быть while(levelChoose < 10...

Чтобы проверить, что выражение не слишком большое, можно проверить следующее (скомпилированный мозгом код!)

const unsigned int MAX = 1000;

unsigned int x;
cin >> x;

while(x < MAX){}
0 голосов
/ 28 августа 2010

levelChoose представляется целочисленным типом некоторой формы (int, long, что угодно).

Недопустимо вводить символ в целое число напрямую, как это. Сбой ввода, но оставляет символ во входящем буфере, поэтому он все еще там, когда цикл возвращается снова.

Вот связанный вопрос: Хороший цикл проверки ввода с использованием cin - C ++

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...