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 bereitsvoid 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()).
-
Da ein einigermassen guter Link: http://www.parashift.com/c++-faq-lite/istream-and-ignore.html
-
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.