2016-08-11 3 views
2

Bitte lesen Sie den folgenden Code:std :: cin Endlosschleife aus ungültige Eingabe

#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; 
} 

Wenn ich std :: cin geben eine ungültige Eingabe, wie w, dann wird Error. Please try again. outputed unendlich. Ich dachte, std::cin.ignore würde den Eingangsstrom leer, und std::cin.clear würde es wieder in den normalen Zustand. Warum passiert die Endlosschleife?

+6

"klar" zuerst. 'ignorieren' Sekunde. –

Antwort

2

standardmäßig std::basic_istream::ignore() ignoriert nur 1 Zeichen:

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

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

Mehr idiomatische Verwendung für Ihren Fall scheint es derjenige aus dem Beispiel zu sein:

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

Beachten Sie auch, dass Sie clear() vor dem ignore() Aufruf aufrufen möchten, also die Eingabeextraktion von ignore() wird erfolgreich sein, anstatt sofort zurückzukehren.

+0

Das hat mein Problem gelöst. Vielen Dank! –