Fehler wenn was anderes als eine Zahl eingegeben wird
-
Folgendes Programm "stürzt ab", wenn ich was anderes als ne Zahl eingebe, wie kann man das abfangen?
#include <iostream> int main() { char name[11]; int alter; std::cout << "Bitte Namen eingeben: "; std::cin >> setw(11) >> name; std::cout << '\n' << name << " bitte geben sie das Alter ein: "; std::cin >> alter; std::cout << "\nZusammenfassung:\n\tName: " << name << "\tAlter: " << alter; }danke
-
Hier ein Besipielprogramm das sowas abfängt
#include <iostream> using namespace std; int main() { int zahl = 1; int summe = 0; EINGABE: try { while(zahl != 0) { cin >> zahl; if(!cin.good()) throw 1; summe += zahl; } } catch(int x) { cin.clear(); cin.ignore( 20, '\n' ); goto EINGABE; } cout << summe << endl; return 0; }Das hatte ich noch rumliegen, soll eigentlich die Wirkungsweise von goto demonstrieren. Ist aber das was du scuhst.
-
Ich hab das ganze mal so geändert, aber irgendwie funktionierts so nicht
int main() { char name[11]; int alter; std::cout << "Bitte Namen eingeben: "; std::cin >> setw(11) >> name; EINGABE: std::cout << '\n' << name << " bitte geben sie das Alter ein: "; std::cin >> alter; if(std::cin.good()) std::cout << "\nZusammenfassung:\n\tName: " << name << "\tAlter: " << alter; else { std::cout << "Ungültige Eingabe.\n"; goto EINGABE; } }
-
Die funktion try()
catch() ist in diesem Falle wohl das Wichtige an dem geposteten Beispielcode.
-
Forumsuche benutzen, oder einfach mal alle Threads auf der Seite durchlesen.
Da findet man weit unten: http://www.c-plusplus.net/forum/viewtopic-var-t-is-144634.html
-
Das du musst das catch noch implementieren.
Das ist der wichtige code, der sorgt nämlich dafür das cin wieder funktioniert und die ungültige eingabe gelöscht wird.Informier dich am besten mal über try,throw und catch.
-
Also das try/goto-Beispiel sieht ja grauenhaft aus - da ist es doch besser, den Stream-Status direkt abzufragen (und while ist eleganter als goto ;))
PS: Wenn du unbedingt mit Exceptions arbeiten willst:
cin.exceptions(ios::failbit|ios::badbit); try { cin>>alter; } catch(ios::failure& e) { //Fehlerbehandlung }
-
Das setzen von der Exception-Maske kann auch ne Exception auslösen (wenn eines der Fehlerbits gesetzt ist), daher sollte man das so machen:
try { cout.exception(ios::failbit|ios::badbit); } catch(ios::failure& e) { //Fehlerbehandlung } try { cin>>alter; } catch(ios::failure& e) //Man sollte hier beachten, dass nicht nur ios::failure-exceptions hier auftreten können { //Fehlerbehandlung }oder vor dem setzen der Exception-Maske mit good() prüfen ob der Stream in Ordnung ist (und ggf. Maßnahmen treffen und dann clear() aufrufen)
Wenn man keine anderen Exceptions wie die vom Stream fangen möchte, kann man auch folgendes machen:
cin >> alter; //viele weitere Operationen try { cin.exception(ios::failbit|ios::badbit); } catch(ios::failure& e) { //Fehlerbehandlung }Aber wie gesagt, damit kann man wirklich nur die Stream-Fehlerzustände fangen und keine anderen Exceptions