2014-12-12 2 views
1

Я знаю, что есть много вопросов, подобных этому, с правильными ответами. Тем не менее, меня беспокоит то, почему мое объяснение приведенного ниже кода неверно.Проверка, является ли ввод целочисленным

#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 пропустит его, что позволит пользователю снова ввести другой символ. Таким образом, программа должна работать нормально (однако на самом деле это не так!)
Почему это не работает, как я объяснил выше?

ответ

2

Если вы раскомментируете std::cin.ignore, код должен работать. Без ignore'h' не удаляется из последовательности, поэтому вы пытаетесь прочитать его снова и снова.

+0

О, это означает, что std :: cin >> n фактически не удаляет «h» из буфера? Если n была строкой, она бы удалила ее правильно? –

+1

@EmpereurAiman ​​Да. Он удаляет ведущее белое пространство, а затем символы, которые могут вносить вклад в вводимый тип. И ничего больше. (В общем, существуют определенные сложности с числами, а в случае, например '' 1.3e + x "', вводят в 'double',' 'e'' и' '+ '' будут извлечены, даже хотя они могли быть только частью двойника, если за ними следовала цифра.) –

0

Ну, символы в C (и C++, я думаю), на самом деле являются маленькими целыми числами, поэтому, если вы хотите проверить, является ли ввод цифрой (или содержит цифру), вы должны проверить его, например, функцией from types.h (IIRC) , Я не уверен, нет ли лучшего, более C++-ish-метода.

Также, что вы здесь делаете, это проверка того, является ли std: cin неверным. Вы уверены, что пустой поток или поток, содержащий только символ новой строки, является ложным?

+1

Он пытается ввести 'int' перед тестированием потока в первый раз. Если поток не содержит целое число, он станет ложным в этой точке. –

+0

ОН, ладно, спасибо, им скорее C парень – 4rlekin

 Смежные вопросы

  • Нет связанных вопросов^_^