Cin Eingabe im falschen Dateiformat lässt Programm im Kreis drehen
-
Hallo Community,
ich habe ein Problem und denke hier bin ich richtig. Das Problem ist wohl ganz trivial, dennoch finde ich keine Lösung. Ich habe eine Eingabe (float) die nur Zahlen zulassen soll. Wenn ich allerdings "muell" oder der gleichen Eingebe, kann ich keine Eingaben mehr machen da als Eingabe immer "muell" vorherrscht oder besser eine zahl die weit im negativen Bereich liegt.
Ich würde aber gerne beim Datentyp float bleiben und nur wieder die Möglichkeit haben eine neue Eingabe vor zu nehmen.Danke schon mal im vor raus

float CBankTerminal::Betrageingben(void) { float Eingabe; cout << "Bitte Betrag eingeben" << "\n"; if (cin >> Eingabe && Eingabe >0) { return Eingabe; } else { cout << "Fehlerhafte Eingabe"<< endl; return 0; }
-
Du musst zwei Dinge tun:
1. cin's Fehlerbits zurücksetzen, das machst du mit cin.clear().
2. "muell" aus dem Puffer löschen, das machst du mit cin.ignore().
ignore() löscht maximal arg1 Zeichen, hört aber auf wenn das Zeichen arg2 gefunden wurde. Wir wollen alles bis zum nächsten Newline löschen, als arg1 wählen wir den maximal möglichen Wert des Types von arg1. Der Typ von arg1 ist std::streamsize. Den maximal möglichen Wert von arithmetischen Typen erhalten wir via std::numeric_limits<typ>::max() (Header <limits> erforderlich!). Also sieht der Aufruf so aus:std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
-
Super, genau das habe ich gesucht und funktionier einwandfrei.
Einen schönen Abend noch
-
Oder ?
if (std::cin.fail ()) { std::cin.clear (); std::cin.sync (); }
-
Es ist implementation defined, was std::istream::sync macht. Es könnte auch einfach nichts tun.
-
b4nan1 schrieb:
Oder ?
if (std::cin.fail ()) { std::cin.clear (); std::cin.sync (); }Ne.
cin.clear()ist gut.cin.sync()ist schlecht. Bei cin.sync() kann es durchaus sein, dass einfach nichts passiert. Darum nimmt man hierfürignore(std::limits<std::streamsize>::max(), '\n'), weil das sicher funktioniert.
-
ahh okay
