2015-09-26 2 views
0

Прежде всего я хотел бы сказать, что знаю, что использование getline - лучшая альтернатива, однако мне любопытно, почему этот код не работает должным образом, и я не могу понять, почемуНеизвестное поведение от cin

#include <iostream> 
#include <string> 
using namespace std; 

int main() { 

    while(1) { 
     int input; 
     cout << "---> "; 
     cin >> input; 
     if(cin.fail()) { 
      char rd = cin.get(); 
      cout << "failure" << rd << "=" << cin.fail() << " " << endl; 
     } 
    } 


    return 0; 
} 

Назначение: если целое число вводится, по-прежнему в противном случае CIN не удается, мы тянем один символ из стандартного ввода и, по существу вывести его. Затем мы продолжаем цикл.

Способ, которым я его вижу, в конце концов cin.get() должен очистить плохой ввод; но он никогда не делает: он застревает в петле infintie. Какие?

ответ

3

cin.fail() определяет, соответствует ли значение, введенное значение, заданное в переменной. Но если cin.fail() истинно, то это означает, что

а) введенное значение не соответствует переменной

б) varialbe не будут затронуты

с) водотоке еще broken

d) введенное значение все еще находится в буфере и будет использоваться для следующего оператора «cin >> variable».

Следовательно, вы должны сделать следующее:

а) ремонт в русле реки через cin.clear();

b) очистить буфер cin.ignore (std :: numeric_limits :: max(), '\ n');

#include <iostream> 
    #include <string> 
    using namespace std; 

    int main() { 

    while(1) { 
    int input; 
    cout << "---> "; 
    cin >> input; 
    if(cin.fail()) { 
     char rd = cin.get(); 
     cout << "failure" << rd << "=" << cin.fail() << " " << endl; 
     cin.clear(); 
     cin.ignore(); 
     } 
     } 
    return 0; 
    } 
0

После ввода целого числа он вводит символ новой строки в качестве символа при нажатии клавиши ввода. То же, что для ввода символов

#include <iostream> 
#include <string> 
using namespace std; 

int main() { 

    while(1) { 
     int input; 
     cout << "---> "; 
     cin >> input; 
     getchar(); 
     if(cin.fail()) { 
      char rd = cin.get(); 
      getchar(); 
      cout << "failure" << rd << "=" << cin.fail() << " " << endl; 

     } 
    } 
    return 0; 
} 
Смежные вопросы