2016-08-11 4 views
2

Пожалуйста, прочтите следующий код:станд :: CIN бесконечный цикл от недопустимого ввода

#include <iostream> 
#include <cstdlib> 
int main() { 
    std::cout << "Please input one integer." << std::endl; 
    int i; 
    while (true) { 
     std::cin >> i; 
     if (std::cin) { 
      std::cout << "i = " << i << std::endl; 
      break; 
     } else { 
      std::cout << "Error. Please try again."<< std::endl; 
      std::cin.ignore(); 
      std::cin.clear(); 
     } 
    } 
    std::cout << "Thank you very much." << std::endl; 
    std::system("pause"); 
    return 0; 
} 

Когда я даю зЬй :: CIN недопустимого ввода, такие как w, то Error. Please try again. является outputed бесконечно. Я думал, что std::cin.ignore пуст входной поток, а std::cin.clear возобновит его до нормального состояния. Итак, почему происходит бесконечный цикл?

+6

'прозрачный' первый. 'ignore' второй. –

ответ

2

По умолчанию std::basic_istream::ignore() игнорирует только 1 символ:

basic_istream& ignore(std::streamsize count = 1, int_type delim = Traits::eof()); 

(От http://en.cppreference.com/w/cpp/io/basic_istream/ignore)

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

cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 

Также обратите внимание, что вы хотите позвонить clear() перед вызовом ignore(), поэтому извлечение ввода ignore() удастся вместо того, чтобы немедленно вернуться.

+0

Это решило мою проблему. Большое спасибо! –