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:0x443468

    Was ist das eigentlich für eine Adresse (0x443468) oder zu wem gehört die,
    wenn man das cin Objekt ausgibt ?


Anmelden zum Antworten