2014-11-14 3 views
1

В настоящее время я работаю над довольно простым кодом. Я пытаюсь проверить вход пользователя так, что если это не что иное, как число, как было запрошено, появится сообщение об ошибке, и будет запрошен новый вход. Я использую цикл while, который должен быть сброшен при нажатии на оператор continue, однако он всегда заканчивается тем, что он попадает в бесконечный цикл, повторяя сообщение об ошибке, если есть недопустимый ввод. Любая помощь будет оценена, спасибо!Оператор C++ continue, ведущий к бесконечному циклу

while (tester != 1){ 
    cout << "Enter your answer: "; 
    cin >> userInput; 
    if (cin.fail()){      //check if user input is valid 

    cout << "Error: that is not a valid integer.\n"; 
    continue; //continue skips to top of loop if user input is invalid, allowing another attempt 
    } else{ 
    tester = 1;  //Tester variable allows loop to end when good value input 
    } 
} 
+0

См [Почему моя программа идти в бесконечный цикл, когда кто-то вводит неверный входной символ] (http://www.parashift.com/c++-faq /stream-input-failure.html)? –

ответ

3

Вам необходимо очистить буфер ввода после сбоя.

Если cin >> something не удается, он не будет потреблять «ошибочный» данные из входного потока и, в следующий раз, когда вы идете назад, чтобы получить больше, он будет читать же ошибочные данные.

Это будет продолжите, чтобы сделать это до тех пор, пока корова не вернется домой, как обычно говорила моя бабушка - не спрашивайте меня, что это значит, я вполне уверен, что она не проводила много времени ясно :-)

Вы можете потреблять до конца строки что-то вроде:

#include <limits> 
: 
std::cin.clear(); 
std::cin.ignore(
    std::numeric_limits<std::streamsize>::max(), 
    '\n'); 

Вот полная программа показывает в действии:

#include <iostream> 
#include <limits> 

int main() { 
    int userInput, tester = 0; 
    while (tester != 1){ 
    std::cout << "Enter your answer: "; 
    std::cin >> userInput; 
    if (std::cin.fail()) { 
     std::cout << "Not a valid integer.\n"; 
     std::cin.clear(); 
     std::cin.ignore(
     std::numeric_limits<std::streamsize>::max(), 
     '\n'); 
     continue; 
    } else { 
     tester = 1; 
    } 
    } 
    return 0; 
} 

Примечание особенно использование

std::numeric_limits<std::streamsize>::max() 

как длина, это означает, что нет нет предела соблюдается. Многие люди будут использовать INT_MAX в этой ситуации, но это не то же самое.

Это практически не имеет значения на практике, так как INT_MAX - очень большое число, и вы, вероятно, встретите конец строки, прежде чем игнорировать это множество символов, но лучше использовать правильное значение, чтобы гарантировать поведение.

+1

+1 вот-вот должен был написать тот же самый ответ. Убей меня к этому lol – Shadow

+1

@ user3189142: у вашей бабушки были похожие черты? Это потрясающе :-) – paxdiablo

+1

Ну, * почти * то же самое. минус часть бабушки – Shadow

1

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

Это, как правило, его сделали:

cin.clear(); 
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
Смежные вопросы