Как обращаться с неправильным вводом типа данных

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

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

 //executes loop if the input fails (eg, 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::max(), '\n'); //discard input std::cout << "Invalid input; please re-enter.\n"; } 

См. Часто задаваемые вопросы по C ++ и другие примеры, включая добавление минимума и / или максимума в состояние.

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

Главный проголосовавший ответ хорошо охватывает решение.

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

 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 или оператор switch, он может зайти в тупик или выполнить условие, которого вы не ожидали, что может быть более запутанным для отладки.

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

Вы можете проверить это через значение ASCII, если значение ascii s между 65 t0 90 или 97 to 122 будет символом.

  • Разница между и
  • что такое неподписанный тип данных?
  • Определить тип файла изображения
  • Ограничение типа множественного типа (ИЛИ)
  • Любые гарантированные минимальные размеры для типов в C?
  • Возвращать определенный тип внутри Haskell
  • Каковы различия между типами () и isinstance ()?
  • Какой тип данных использовать для hashированного поля пароля и какой длины?
  • Строка к двоичной в C #
  • длинный длинный в C / C ++
  • Итерация по интерфейсу
  • Interesting Posts

    Выберите 3 последних записей, в которых значения одного столбца отличаются

    React Native error: «Невозможно определить версию java из« 9.0.1 ».»

    Каково значение url-шаблона в web.xml и как настроить сервлет?

    Что такое ModelState.IsValid, допустимое для ASP.NET MVC в NerdDinner?

    Каковы основные недостатки Java Server Faces 2.0?

    Обработка исключений Spring Resttemplate

    Доступ MS Access (JET) подходит для многопользовательского доступа?

    Gmail SMTP debug: ошибка «войдите в свой веб-браузер»

    Почему C # не поддерживает возврат ссылок?

    Как создать экземпляры подclassов управляемого объекта в расширении NSManagedObject Swift?

    Почему ковариация и контравариантность не поддерживают тип ценности

    Обновление значения свойства в файле свойств без удаления других значений

    Как настроить CMake для создания приложения для iPhone

    отправка сообщения на chrome-расширение с веб-страницы

    В чем разница между «?», «E» и «T» для Java-дженериков?

    Давайте будем гением компьютера.