Я знаю, что есть много вопросов, подобных этому, с правильными ответами. Тем не менее, меня беспокоит то, почему мое объяснение приведенного ниже кода неверно.Проверка, является ли ввод целочисленным
#include <iostream>
#include <string>
int main(){
std::cout << "Write an integer:\n>";
int n;
std::cin >> n;
while (!std::cin) {
std::cout << "ERROR, you are allowed to enter an integer only.Try again!\n>";
std::cin.clear();
//std::cin.ignore(10000,'\n');
std::cin >> n;
}
std::cout << "\nYou entered the integer: " << n;
return 0;
}
Что происходит сейчас, что, если я ввести символ, как «ч», он будет продолжать показывать предложение об ошибке навсегда.
Предположим, что я не запускал программу. Я бы объяснил вышеприведенный код, как показано ниже:
Когда я ввожу недопустимый ввод, такой как «h», cin не сработает, и условие while станет истинным. Кроме того, во входном буфере будет символ «\ n».
Теперь в программе отобразится сообщение об ошибке и отметьте флаг ошибки cin. Теперь cin возвращается в исходное состояние, чтобы снова получить вход.
Теперь во входном буфере присутствует символ новой строки, а cin пропустит его, что позволит пользователю снова ввести другой символ. Таким образом, программа должна работать нормально (однако на самом деле это не так!)
Почему это не работает, как я объяснил выше?
О, это означает, что std :: cin >> n фактически не удаляет «h» из буфера? Если n была строкой, она бы удалила ее правильно? –
@EmpereurAiman Да. Он удаляет ведущее белое пространство, а затем символы, которые могут вносить вклад в вводимый тип. И ничего больше. (В общем, существуют определенные сложности с числами, а в случае, например '' 1.3e + x "', вводят в 'double',' 'e'' и' '+ '' будут извлечены, даже хотя они могли быть только частью двойника, если за ними следовала цифра.) –