While-Schleife neu beginnen lassen?
-
Hallo Leute,
bin noch recht neu in der Programmierwelt und habe nun folgendes Problem:Ich habe aus Spaß ein Script erstellt, welches eine Eingabe auf Richtigkeit überprüft (ob es sich um eine Zahl handelt) und diese dann durch 2 teilt.
Sobald man ein falsches Zeichen, z.B. ein Ausrufezeichen eingibt, sollte eine Fehlermeldung kommen, was auch geschieht. Aber die Schleife beginnt nicht neu, sondern die Fehlermeldung wird dauerhaft wiederholt.
Hier ist der Code, ich hoffe mir kann jemand helfen.
[/cpp]
#include <iostream> using namespace std; int main () { float zahl; while( true ){ cout << "Bitte zahl eingeben, die durch 2 geteilt werden soll: "; // Eingabe der Zahl cin >> zahl; // Prüfung ob Eingabe falsch ist (kein float) und Fehlermeldung if(cin.fail()) cout << "Falsche Eingabe! Neue Eingabe bitte: " << endl; // Wenn Eingabe float ist, berechnen else cout << zahl / 2 << endl; }//while return 0; }//mainDanke im Voraus
Gruß
Luck3r
-
Das cin Objekt geht nach der Falscheingabe in einen Fehlerzustand, den du für eine erneute Eingabe erst beseitigen musst und die Zeichen, die nicht in die float Variable gesteckt werden konnten, bleiben im Eingabepuffer. Die müsstest du vor einer erneuten Eingabe ebenfalls entfernen.
Die Forensuche sollte dir auch noch zeigen wie das geht. Das Thema kommt häufig.
-
Da war jemand schneller. So würde es gehen:
#include <iostream> using namespace std; int main() { float zahl; while(true) { cout << "Bitte zahl eingeben, die durch 2 geteilt werden soll: "; cin >> zahl; if(cin.fail()) { cout << "Falsche Eingabe! Neue Eingabe bitte.\n"; cin.clear(); cin.sync(); } else cout << zahl / 2 << '\n'; } return 0; }
-
Na wenn cin.fail() mal true war, dann bleibt das auch so, solange bis du cin.clear() aufrufst

-
C++ ist keine Scriptsprache. *würg* *kotz*
-
@314159265358979
Hihi.
Da muss ich dir mal Recht geben, ist mir vorhin auch schon übel aufgestossen
-
hustbaer schrieb:
@314159265358979 [...] Da muss ich dir mal Recht geben, [...]
*ausdruck*, *einrahm*, *aufhäng*
-
Thuruk schrieb:
cin.sync();Ich glaube nicht, dass das macht, was du glaubst, dass es macht. Das Verhalten von std::istream::sync ist auf Default-Streams nicht in wirklich sinnvoller Weise definiert.
Die Definition (in C++03) läuft wie folgt: std::istream::sync erstellt einen sentry und ruft rdbuf()->pubsync() auf (vgl. 27.6.1.3 (35)). std::streambuf::pubsync ruft std::streambuf::sync auf (vgl. 27.5.2.2.2 (3)), und std::streambuf::sync ist, wenn nicht ggf. von einer Kindklasse etwas anderes spezifiziert wurde (das ist bei std::cin nicht der Fall), nur auf Ausgabeströmen überhaupt definiert:
ISO/IEC 14882:2003 27.5.2.4.2 (7) schrieb:
Effects: Synchronizes the controlled sequences with the arrays. That is, if pbase() is non-null the characters between pbase() and pptr() are written to the controlled sequence. The pointers may then be reset as appropriate.
Der code funktioniert übrigens bei mir (gcc 4.6 unter Linux) auch nicht. Es könnte eine Microsoft-Erweiterung sein wie fflush(stdin), oder reiner Zufall, der sich aus undokumentierten Implementationsdetails ergibt und jederzeit zu funktionieren aufhören kann; so oder so sollte man sich nicht darauf stützen, wenn es standardkonforme Alternativen gibt. Ich schlage
#include <iostream> #include <limits> void clear_input_stream(std::istream &in = std::cin) { in.clear(); in.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); }vor.
-
Vielen Dank für eure Antworten, so funktioniert es. Danke!
Und ich werde es in Zukunft natürlich unterlassen, das Wort Script im Zusammenhang mit C++ zu verwenden
