Вопрос по input, c++, types – Как обрабатывать неправильный ввод данных

22

В C ++, как вы обрабатываете неправильные вводы? Например, если программа запрашивает целое число, когда вы набираете символ, она должна что-то делать, а затем повторять цикл для повторения ввода, но цикл становится бесконечным, когда вы вводите символ, когда необходимо целое число, и наоборот.

Ваш Ответ

4   ответа
6

получивший наибольшее количество голосов, очень хорошо описывает решение.

В дополнение к этому ответу это может помочь визуализировать, что происходит немного лучше:

int main()

    int input = 1;//set to 1 for illustrative purposes
    bool cinState = false;
    string test = "\0";
    while(input != -1){//enter -1 to exit
        cout << "Please input (a) character(s): ";//input a character here as a test
        cin >> input; //attempting to input a character to an int variable will cause cin to fail
        cout << "input: " << input << endl;//input has changed from 1 to 0
        cinState = cin;//cin is in bad state, returns false
        cout << "cinState: " << cinState << endl;
        cin.clear();//bad state flag cleared
        cinState = cin;//cin now returns true and will input to a variable
        cout << "cinState: " << cinState << endl;
        cout << "Please enter character(s): ";
        cin >> test;//remaining text in buffer is dumped here. cin will not pause if there is any text left in the buffer.
        cout << "test: " << test << endl;
    }
    return 0;    
}

Выгрузка текста из буфера в переменную не особенно полезна, однако помогает понять, почемуcin.ignore() является необходимым.

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

44

по которой программа переходит в бесконечный цикл, заключается в том, чтоstd::cinПлохой флаг ввода установлен из-за сбоя ввода. Нужно сбросить этот флаг и отбросить неверный ввод из буфера ввода.

//executes loop if the input fails (e.g., no characters were read)
while (std::cout << "Enter a number" && !(std::cin >> num)) {
    std::cin.clear(); //clear bad input flag
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); //discard input
    std::cout << "Invalid input; please re-enter.\n";
}

УвидетьC ++ FAQ для этого и других примеров, в том числе добавление минимума и / или максимума в условие.

Другой способ - получить входные данные в виде строки и преобразовать их в целое число сstd::stoi или другой метод, который позволяет проверить конверсию.

но как проверяет цикл while! (cin & gt; & gt; num)? Zik
спасибо за сайт Zik
Я провел некоторое исследование, прежде чем спрашивать здесь. Я видел, что они ставят cin.ignore (1000, 'n'); что это делает? Также! (Cin & gt; & nt) возвращает логическое значение? я не знал, что Zik
@Marvin,cin >> num терпит неудачу, если пользователь печатает, скажем, "a"; когда он ожидал Int. Он предоставляет оператор преобразования, позволяющий неявно преобразовать его вvoid *, Еслиcin в плохом состоянии, вернетсяNULL, Если нет, он вернет объект. Затем его можно взять и преобразовать в bool: true, если не NULL, false, если NULL. Затем цикл может использовать это для оценки необходимого выражения bool.
@Marvin,cin.ignore (1000, '\n') игнорирует / отбрасывает символы во входном буфере до тех пор, пока либо 1000 не будет отброшено, либо не будет обнаружена новая строка, в зависимости от того, что произойдет раньше Это хороший способ избавиться от линии. Вы увидите, что в примере с parashift они используют максимальный размер потока вместо 1000, чтобы учесть линию максимальной длины. я используюcin.sync() потому что при этом я хочу быть в равных условиях с пользователем (пока не читал следующую строку), поэтому я отказываюсь от всего. В заключение,cin имеетoperator void *, так что это не может конвертировать в bool.
-2

если значение ascii s между 65 t0 90 или от 97 до 122 будет символьным.

Откуда вы знаете, что система использует ASCII?
-2

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

Похожие вопросы