Eingaben wiederholen, ohne hängen zu bleiben
Eine erneute Eingabe darf nicht nur die Ausgabe einer Frage wiederholen. Nach einem Formatfehler bleibt std::cin in einem Fehlerzustand. Ohne gezielte Behandlung würde jede weitere Leseoperation sofort scheitern.
Eingaben wiederholen, ohne hängen zu bleiben#
Entscheidungen und Schleifen · Lektion 21 von 60
Voraussetzungen: Schleifen, cin. Lernziel: Du behandelst falsche Zahlenformate und das Eingabeende getrennt.
Eine erneute Eingabe darf nicht nur die Ausgabe einer Frage wiederholen. Nach einem Formatfehler bleibt std::cin in einem Fehlerzustand. Ohne gezielte Behandlung würde jede weitere Leseoperation sofort scheitern.
1#include <iostream>2#include <limits>3 4int main() {5 int zahl{};6 while (true) {7 std::cout << "Zahl von 1 bis 10: ";8 if (std::cin >> zahl) {9 std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');10 if (zahl >= 1 && zahl <= 10) {11 break;12 }13 std::cout << "Die Zahl liegt ausserhalb des Bereichs.\n";14 } else {15 if (std::cin.eof() || std::cin.bad()) {16 std::cerr << "Eingabe beendet oder nicht lesbar.\n";17 return 1;18 }19 std::cin.clear();20 std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');21 std::cout << "Das war keine lesbare ganze Zahl.\n";22 }23 }24 std::cout << "Auswahl: " << zahl << '\n';25}Die Zustände auseinanderhalten#
eof() prüft auf erreichtes Eingabeende. bad() zeigt einen schwereren Streamfehler an. Ein gewöhnlicher Formatfehler setzt typischerweise failbit, ein Fehlermerkmal. clear() löscht Zustandsflags; es entfernt keine Zeichen. ignore(..., '\n') entfernt anschließend den unbrauchbaren Zeilenrest einschließlich des gefundenen Zeilenumbruchs.
Prüfe das Eingabeende vor dem Zurücksetzen. Würdest du bei EOF immer nur clear() aufrufen und erneut lesen, entstünde ohne neue Daten eine dauernd scheiternde Schleife.
Zustandsänderungen klein halten#
Verarbeite den Wert erst nach erfolgreicher Format- und Bereichsprüfung. Sammle nicht gleichzeitig Punkte oder ändere andere Daten, während noch unklar ist, ob die Eingabe gültig ist. Der Übergang „Eingabe vollständig geprüft, jetzt anwenden“ hält die Logik nachvollziehbar.
Übung#
Teste in einem Durchlauf abc, 20 und 5. Beende außerdem die Eingabequelle, statt eine Zahl zu liefern.
Lösung
Nach abc muss eine neue Eingabe möglich sein. 20 führt zur Bereichsmeldung. 5 beendet die Schleife erfolgreich. Bei Eingabeende muss das Programm terminieren, also aufhören zu laufen, statt endlos die Frage zu drucken.
Weiterlernen#
Zurück: Wiederholungen mit while, do-while und for · Kursübersicht · Weiter: Eigene Funktionen definieren und aufrufen
Kommentare 0
Kommentare sind für diese Seite deaktiviert.