Also ich versuche mal hier ein wenig Licht ins Dunkle zu bringen.
Also das es akzeptiert stimmt nicht ganz. Die Daten liegen auch noch auf dem Stream, wenn nicht akzeptiert wurde!
Dafür gibt es ja die Dokumentation
Also es gibt drei Statusflags in der std::ios. Grob kann man das so beschreiben:
- das Badbit wird nur bei ernsthaften IO Fehlern gesetzt
- das Failbit für Operationen die einen Fehler erzeugen dürfen
- das Eofbit um zu signalisieren dass das Ende des Streams erreicht wurde
Für unseren Fall ist das Failbit interessant. Ich habe mal ein wenig Beispielcode vorbereitet:
Zu dem Beispiel von wacked:
Bitte nicht! Hier wird C mit C++ vermischt was in den seltensten Fällen zu empfehlen ist, und m. M. n. auch kein guter Style ist! Eine schöne Erklärung warum man das nicht will gibt es hier.Sonst würde ich es halt so machen:
Code:#include <iostream> #include <cstdio> #include <errno.h> int main() { int a; while(1) { int ret = scanf("%d", &a); // could an int be read? if (ret == 1) { break; } // is the stream fucked or has it ended? else if (ferror(stdin) || feof(stdin)) { return 0; } else { // remove the unparsed data from stdin, // so the next call to scanf doesn't // read the same data again // todo: find out why fflush(stdin) // doesn't work getchar(); } } std::cout << a << '\n'; }
Abschließend bleibt noch zu sagen dass Reguläre Ausdrücke für das validieren von Zahlen, wortwörtlich, mit Kanonen auf Spatzen schießen ist! Mit welchen anderen Problemen man dann zu Kämpfen hat zeigt die Exception weiter oben ganz gut finde ich!