int einlesen!
-
Ich habe ein Dominospiel für die Schule geschrieben das als benutzereingabe einen int wert erwartet:
int MenschlicherSpieler::eingeben(){ int eingabe; std::cin>>eingabe; return eingabe; }Das Problem ist jetzt das wenn man einen Buchstaben statt einer Zahl eingibt cin damit nicht klarkommt-> Endlosschleife.
Was gibt es da für Möglichkeiten damit umzugehen?
-
du könntest den char casten, dann hast du den ASCII-wert.
oder du baust das hier ein:for(char temp="A"; temp>="Z"; temp++) { if(eingabe==temp) { //Fehlerausgabe und Programmteil überspringen; wieder zurück zur Eingabe } }
-
Hoi erstmal,
ALSO:blizzarac schrieb:
int MenschlicherSpieler::eingeben(){ int eingabe; std::cin>>eingabe; return eingabe; }Das Problem ist jetzt das wenn man einen Buchstaben statt einer Zahl eingibt cin damit nicht klarkommt-> Endlosschleife.
Was gibt es da für Möglichkeiten damit umzugehen?
das (-> "Endlosschleife") kann eigentl. nicht sein, denn der Operator >> ist für die Klasse istream auch für int überladen...d.h.:
wenn du sowas machst:int iInput; cin >> iInput;funktioniert das einwandfrei... du solltest nur um sicher zugehen ne Fehlerüberprüfung einbauen...etwa so:
int iInput; if(cin >> iInput) { // Eingaben OK, jetzt verarbeiten! // ... } else { // fehlerhafte Eingabe des Benutzers, jetzt debugging! // ... }__________________________________________________
also, in deinem Fall:int MenschlicherSpieler::eingeben() { int eingabe; if(std::cin >> eingabe) return (eingabe); else return (-1); // Fehler, keine gute Lösung, da nicht eindeutig! }
-
Das Problem ist nicht das ich keine Integer eingeben kann.
Das Problem ist das wenn ich statt einem Integer einen Buchstaben oder mehr davon eingebe die cin methode selbst ärger macht d.h. eine Fehlerbehebung danach nicht moeglich ist @Codefinder genauer lesenDen Wert als char einlesen ist eine möglickeit, aber für eine einfache integereingabe ist dass ein bischen viel. Gibt es nicht eine in C++ integrierte Lösung für das problem?
-
hi nochmal,
Ich hab deine Klassenmethode (denk mal es ist eine
) mal in eine Funktion umgeschrieben... da:#include <iostream> using namespace std; int eingeben() { int eingabe; cin >> eingabe; return (eingabe); }ist ja genau das gleiche, nur als Funktion...
so, nun hab ich das so getestet:int main() { cout << eingeben() << endl; return (0); }ERGEBIS: er hängt nicht; er fällt nicht inne Endlosschleife oder sonst was...
Bei einer Eingabe von bspw: "abc" gibt er "-858993460" aus!
Das Problem kann also nur in deinem folgenden Code liegen, oder ich hab dich total falsch verstande

PS_1: siehe auch:
CodeFinder schrieb:
das (-> "Endlosschleife") kann eigentl. nicht sein, denn der Operator >> ist für die Klasse istream auch für int überladen...
Das schließt Debugging natürlich mit ein!
PS_2:
blizzarac schrieb:
Fehlerbehebung danach nicht moeglich ist @Codefinder genauer lesen
wo versuchst du denn den Fehler zu behandeln, bzw. zu prüfen, ob überhaupt einer vorliegt...wäre mal interessant!

-
blizzarac schrieb:
Was gibt es da für Möglichkeiten damit umzugehen?
Überprüfe ob deine Eingabe tatsächlich eine Zahl ist. --> Forum Suche
-
Entferne nach der fehlerhaften Eingabe die fehlerhaften Zeichen aus dem Stream bevor Du versuchst wieder eine Zahl zu lesen (wenn Du eine Zahl liest, liest er Ziffern. Wenn im Eingabepuffer Buchstaben stehen, liest er nichts).
@CodeFinder:
Ja klar, wenn Du die Eingabe nicht in eine Schleife legst gibt es auch keine Endlosschleife
-
LordJaxom schrieb:
Ja klar, wenn Du die Eingabe nicht in eine Schleife legst gibt es auch keine Endlosschleife

ich wollte nur klar machen, dass das
blizzarac schrieb:
die cin methode selbst ärger macht
nicht sein kann...

PS:
LordJaxom schrieb:
Entferne nach der fehlerhaften Eingabe die fehlerhaften Zeichen aus dem Stream bevor Du versuchst wieder eine Zahl zu lesen (wenn Du eine Zahl liest, liest er Ziffern. Wenn im Eingabepuffer Buchstaben stehen, liest er nichts).
damit meint er glaub ich:

cin.clear(); cin.sync();
-
Weiss persönlich nicht was sync() macht aber clear() ist jedenfalls schonmal sinnvoll um die Fehlerflags zu löschen. Dann evtl. noch
cin.ignore(std::numeric_limits<int>::max(), '\n');um alle Zeichen bis zum Ende der Zeile zu ignorieren (da die Eingabe ja immer mit Return abgeschlossen wird (input buffering), gibt man dem Benutzer so die Möglichkeit eines neuen Versuchs)