cin nach Variablenüberlauf
-
Hallo,
ich habe das Problem, dass wenn ich den Überlauf einer Variable erzeuge danach weitere Eingaben von cin in einer Schleife ignoriert werden. Mal ein bsp:
ma kurz lostippen
main ()
int test;
int i=0;while (1)
{cout << "Bitte geben Sie eine Zahl ein\n"
cin >> test;
rewind (stdin);
cout << test;i++;
if (i==5) break;
}Soll wie gesagt nur ein Bsp sein. Wenn ich nun einen Überlauf provoziere, wird mir der auch im ersten Durchlauf angezeigt, aber danach läuft er über das cin hinweg. Ich suche eine Erklärung dafür...und vielleicht auch nen
Lösungsansatzgruss micha
-
Die Eingabe- und Ausgabestreams im System sind gepuffert, es werden also Eingaben zwischengespeichert, falls cin gerade "nicht zur Stelle ist", um die Eingaben zu verarbeiten. Liest du zum Beispiel mit cin ein char ein und gibst 3 char ein, holt cin 1 char aus dem Buffer, 2 chars bleiben drin. Bei einem zweiten Aufruf von cin mit char wird das noch im Buffer vorhandene Zeichen genommen, das du beim letzten mal zu viel eingegeben hast, somit wartet cin nicht auf eine erneute Eingabe. Du kannst den Buffer aber manuell wie unten dargestellt löschen.
#include <iostream> int main () { int test = 0; for (int i=0;i<5;i++) { std::cout << "\nBitte geben Sie eine Zahl ein:"; std::cin >> test; std::cin.clear(); //cin-Errorflags löschen std::cin.ignore(255,'\n'); //cin anweisen, den Rest des Buffers zu ignorieren std::cout << "Die eingegebene Zahl lautet: " << test; } return 0; }
Manche Leute schreiben fflush(stdin); aber davon kann ich nur abraten, da das keine genormte Vorgehensweise ist. Das Flushen eines Ausgabebuffers veranlasst das System, diesen sofort auf die Standardausgabe zu entleeren. Mit einem Inputbuffer geht das logischerweise nicht, diesen kann man nur löschen.
EDIT: Hatte ignore vergessen
-
In dem Fall wird er auch über die Eingabe weglaufen, weil der Kram, der den overflow erzeugt hat, immer noch im stream ist. Sinnvoller wär eine gebufferte Eingabe, also etwa so:
#include <iostream> #include <sstream> #include <string> int main () { int test = 0; std::stringstream sstr; std::string zeile; for (int i = 0; i < 5; ++i) { do { std::cout << "Bitte geben Sie eine Zahl ein: "; std::getline(std::cin, zeile); sstr.clear(); sstr.str(zeile); sstr >> test; } while(!sstr); std::cout << "Die eingegebene Zahl lautet: " << test << std::endl; } return 0; }
-
Ja mit cin.clear() tut es bei mir. Allerdings nur in Verbindung mit dem Befehl
rewind (stdin); Wieso?