Falsche Eingabe bei cin -> cin.clear ohne Wirkung
-
Hallo
Bei folgenden Code wollte ich in einer Endlosschlaufe den Benutzer zwingen eine Ziffer und nicht etwa einen Buchstaben einzugeben.
Den Fehlerzustand von cin lösche ich mit cin.clear(). Aber die weiteren Abfragen mit cin werden gar nicht erst durchgeführt. Der break habe ich jetzt nur eingesetzt, weil sonst die Schlaufe endlos durchrattert.Warum wird nach dem clear keine neue cin Abfrage gemacht ?
int ziffer = 5; // 5 = defaultwert cout << "Bitte Ziffer eingeben:"; cin >> ziffer; while (!cin) { cout << "Unerlaubte Eingabe! Bitte nochmal eingeben:" << endl; cout << "cin Zustand:" << cin << endl; cin.clear(); // Fehlerzustand zurücksetzen cout << "cin Zustand:" << cin << endl; cin >> ziffer; // Nochmals abfragen cout << "Ziffer:" << ziffer << endl; break; //testweise break gesetzt } cout << "OK, die Eingabe war:" << ziffer << endl;
Die Ausgabe ist:
Bitte Ziffer eingeben:apfelmus Unerlaubte Eingabe! Bitte nochmal eingeben: cin Zustand:0 cin Zustand:0x443468 Ziffer:5 OK, die Eingabe war:5
Gruss, Peter
-
mit dem clear löscht du nur die Errorbits. Beim erneuten parsen kommt aber gleich wieder ein Fehler. Du musst die Daten im Eingabepuffer löschen, das ganze geht mit ignore:
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
-
Tatsächlich, so funktioniert's :
int ziffer; cout << "Bitte Ziffer eingeben:"; cin >> ziffer; while (!cin) { cout << "Unerlaubte Eingabe! Bitte nochmal eingeben:"; cin.clear(); // Fehlerzustand zurücksetzen cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // Buffer löschen cin >> ziffer; // Nochmals abfragen } cout << "OK, die Eingabe war:" << ziffer << endl;
Danke
-
Peter01 schrieb:
while (!cin) { cout << "cin Zustand:" << cin << endl; }
Die Ausgabe ist:
cin Zustand:0x443468Was ist das eigentlich für eine Adresse (0x443468) oder zu wem gehört die,
wenn man das cin Objekt ausgibt ?