оператор переключения регистра не работает правильно? - PullRequest
0 голосов
/ 23 августа 2011

Так что я делаю меню в простом консольном приложении. Мой код в значительной степени: (ССЫЛКИ НА АКТУАЛЬНЫЙ КОД ВНУТРИ!)

int input;
bool LOOPING = true;

while(LOOPING)
{
cout << "Select an option:\n";
cout << "1 - option 1\n";
cout << "2 - option 2\n";
cout << "3 - option 3\n";
cout << "4 - option 4\n>";
cin >> input;

switch(input) {
    case 1:
        game();
        break;
    case 2:
        game();
        break;
    case 3:
        game();
        break;
    case 4:
        game();
        break;
    default:
        cout << "ERROR: invalid input!\nPlease enter in a number!\n\n";
        break;
}
}
// rest of app...

Моя проблема в том, что программа просто входит в постоянный цикл текста! Почему это происходит? Почему default: не мешает этому случиться и как я могу предотвратить это?

Заранее спасибо!

РЕДАКТИРОВАТЬ: запрашивается реальный код.

http://pastie.org/2415852
http://pastie.org/2415854
http://pastie.org/2415855

1 Ответ

7 голосов
/ 23 августа 2011

Ваш код зацикливается бесконечно, потому что вы никогда не устанавливаете LOOPING в false.В реальном коде вы устанавливаете его в false только тогда, когда пользователь выбирает выход, что никогда не произойдет, потому что пользователь больше не может вводить ввод после того, как он вводит ненулевое число в первый раз.

Причина, по которой он не запрашивает ввод после ввода символа, заключается в том, что >> не использует недопустимый ввод.Т.е. если >> предполагается записать в int, но введенное пользователем не является действительным int, оно не будет записывать в int, но также не удалит пользовательский ввод из потока (вместо этогопросто установите флаг ошибки cin, который вы должны проверить).

Ввод будет оставаться в потоке, пока вы не напишите его где-нибудь еще или не отмените его.Пока вы не сделаете это, каждая последующая попытка прочитать int не будет выполнена, поскольку неверный ввод все еще находится в потоке.

...