2016-04-12 11 views
1

Lassen Sie mich Ihnen zuerst meine Quelle zeigen.ist die Sequenz zwischen cin.clear() und cin.ignore() erforderlich?

#include <iostream> 
#include <limits> 

using namespace std; 

int main() { 
    int n; 

    while (true) { 
     cout << "Type >> "; 
     cin >> n; 

     if (cin.fail()) { 
      cin.clear(); 
      cin.ignore(numeric_limits<streamsize>::max(), '\n'); 
      cout << "Not a number" << endl; 

      continue; 
     } 

     if (n % 2) 
      cout << "odd"; 
     else 
      cout << "even"; 

     cout << endl; 
    } 

    return 0; 
} 

Nun, dieser Code kann ohne Probleme ausgeführt werden. Wenn ich jedoch zwischen cin.clear() und cin.ignore() wechsle und dann character (nicht ganzzahlig) schreibe, bleibt es in der Endlosschleife hängen. (Konsultieren nächsten Code)

#include <iostream> 
#include <limits> 

using namespace std; 

int main() { 
    int n; 

    while (true) { 
     cout << "Type >> "; 
     cin >> n; 

     if (cin.fail()) {    
      cin.ignore(numeric_limits<streamsize>::max(), '\n'); 
      cin.clear(); 
      cout << "Not a number" << endl; 

      continue; 
     } 

     if (n % 2) 
      cout << "odd"; 
     else 
      cout << "even"; 

     cout << endl; 
    } 

    return 0; 
} 

Ich frage mich Sequenz zwischen cin.clear neccesary ist() und cin.ignore(). Wenn es ist, möchte ich wissen, warum es Sequenz benötigt.

Thx für meine Frage zu lesen. Ich werde für Ihre Antworten sehr dankbar sein. Entschuldigung für unartikulierte Schreiben.

Antwort

0

Schauen wir uns den zweiten Schnipsel Schritt für Schritt:

if (cin.fail()) { 

Wenn wir dies eintreten, der Strom ist schon schlecht. Die Eingabeoperation

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

schlägt sofort fehl und tut nichts. So wird nach

cin.clear(); 

der Müll Eingang befindet sich noch in dem Strom und macht

cin >> n; 

wieder fehlschlagen, ohne auch nur eine Eingabe wartet, die uns an den Anfang zurückkommt.

Wenn Sie die Anrufe tauschen um (wie im ersten Schnipsel), die clear wird der Strom „gut“ wieder machen, dann ignore wird der Müll Eingabe erfolgreich befreien und die cin >> n; wird wie erwartet.

+0

Wow, ich verstehe. Jetzt weiß ich warum. Thx! Dann, cin.ignore (numeric_limits :: max(), '\ n') funktioniert nicht, wenn cin.failbit bereits gesetzt ist, oder? –

+0

@ChingChangeatthebaby Korrekt, schließlich ist es auch eine Eingabefunktion. –

0

Während cin.fail() wahr ist, werden alle Versuche, aus dem Stream zu lesen, - eh - fehlschlagen.

Der Aufruf cin.clear() entfernt die Fehlerflags aus dem Datenstrom und ermöglicht so die erneute Eingabe.