Unklarer Ablauf in do while schleife
-
Hallo ich habe ein Problem mit folgender Schleife:
do { textcolor(30); gotoxy(X+1,Y+2); cout <<" "; gotoxy(X+1,Y+3); cout <<" "; gotoxy(X+1,Y+4); cout <<" "; gotoxy(X+1,Y+5); cout <<" "; gotoxy(X+1,Y+6); cout <<" "; gotoxy(X+1,Y+7); cout <<" "; gotoxy(X+1,Y+3); cout <<" Eingabe der Anzahl ... ";cin >> addgroups; //addgroups = int(caddgroups); if(addgroups <1) { textcolor(28); gotoxy(X+1,Y+2); cout <<" Mindestanzahl Gruppen = eins !!! "; gotoxy(X+1,Y+3); Sleep(warte); } else if(addgroups + spiel.Gruppen > 5) { textcolor(28); gotoxy(X+1,Y+2); cout <<" Gruppen Hoechstanzahl ueberschritten !!! "; gotoxy(X+1,Y+3); Sleep(warte); } } while(addgroups + spiel.Gruppen >5 || addgroups <1 );Immer wenn für cin >> addgroup anstatt einer Zahl ein char eingeben wird
ensteht eine endlos- schleife mit eventuellem pc absturz,
obwohl eigentlich der user je durchlauf addgroup aktuallisieren müsste.
wird jedoch einfach ignoriert.
wieso?? und wie kann man falsch eingaben absichern.
dachte vielleicht die eingabe als char zur ermöglichen und diese variable dann in einen integer wert zu wandeln, jedoch hängt das programm dann trotzdem in einer
endlos schleife fest.wie gesagt dann wird mein cin einfach ignoriert???
kann mir da jemand helfen?
mfg Conroe
-
Vorschlag: Gebe einen String statt einen Integer ein und werte diesen selbst aus, dann hast du alles in der Hand.
-
Wir vereinfachen das Problem:
#include <iostream> int main() { int i; do { std::cin >> i; }while( i != 0 ); return 0; }Das reicht erstmal um den Fehler zu erzeugen.
Sobald eine Eingabe auftaucht, die cin nicht verarbeiten kann setzt er das Fehlerflag und gibt keine Werte mehr her.
Fehler kann man mit operator! abfragen.
z.B.:int main() { int i; do { std::cin >> i; if( !std::cin ) break; // oder wie man eben reagieren möchte... }while( i != 0 ); return 0; }
-
Ok danke erstmal,
bin deinem ratschlag gefolgt, funktioniert auch soweit.
aber wie kann ich dem cin objekt wieder klarmachen das es wieder
werte entgegen nehmen soll?
-
std::cin.clear(); // Löscht alle Fehlerflags. std::cin.sync(); // Überspringt alle bisher gelesenen Zeichen.Grüssli
-
Puffer leeren ist auch angebracht.
-
aber die methode clear() ist bestimmt sehr hilfreich gleich mal ausprobieren.
thx
std::cin.sync(); // Überspringt alle bisher gelesenen Zeichen.
Was meinst du damit genau?Und wie leere ich den Puffer?

-
flush()
glaub ich...