Puffer richtig leeren bei while-Schleife?



  • Hallo,

    bevor ich jetzt mit Aufforderungen, die Suchfunktion zu benutzen, konfrontiert werde: Ich habe schon gegoogelt und rumgesucht, aber irgendwie hat keine der Lösungen funktioniert. Es geht um ein Programm, das Einmaleins-Aufgaben stellt und man nach jeder Aufgabe die Lösung angeben soll. Klappt auch alles bisher, nur wird bei fehlerhafter Eingabe eine Endlosschleife verursacht.
    Der Code, wo das Problem auftritt:

    std::cout << std::endl << "Zum Starten des Tests <Enter> druecken . . . ";
        std::cin.get();
        int ergebnis;
        for (int i = 0; i < 10; i++)
        {
            std::cout << std::setw(2) << i+1 << '.' << std::setw(2) << "" << aufgaben[i] << " = ";
            while (!(std::cin >> ergebnis)) // Hier tritt das Problem auf
            {
                std::cout << "Ungueltige Eingabe! Bitte wiederholen." << std::endl; 
                std::cout << std::setw(2) << i+1 << '.' << std::setw(2) << "" << aufgaben[i] << " = ";
            } 
        }
    

    Wenn also z.B. ein Buchstabe eingegeben wird, geht direkt eine Endlosschleife los, egal was ich auch probiere. So könnte ich mir die while-Schleife eigentlich auch sparen 😉
    Habe bereits

    void leerePuffer()
    {
        setvbuf( stdin, NULL, _IONBF, 0 );
        setvbuf( stdin, NULL, _IOFBF, BUFSIZ ); 
    }
    

    und

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

    probiert und es hat nicht geklappt bzw. ich habe es an den falschen Stellen eingesetzt.



  • Das Problem gab es schon mehrmals, aber ich habe auch keine Lust, jetzt danach zu suchen, daher hier die Lösung:

    cin.clear(); // erst den Stream aus dem Fehlerzustand bringen
    cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // dann den Rest der Zeile ignorieren
    

    Wie das funktioniert, kannst du dagegen wieder googlen, jetzt hast du ein Stichwort (cin.clear()).





  • Okay, werd ich machen.

    Edit: Perfekt, genau das, wonach ich gesucht habe. dankeschön. 😉



  • Um nach std::cin.get(); den Puffer zu leeren, würde std::cin.ignore(std::numeric_limitsstd::streamsize::max(), '\n');
    reichen, oder?



  • Wenn du dir ganz sicher bist, dass keine Fehleingabe eintritt, ja. cin.clear() setzt die Errorbits auf OK.


Log in to reply