Fragensteller
Eingabe überprüfen

Allgemeine Diskussion
-
Hallo!
Ich, C++-Anfänger, schreibe gerade ein Spiel und habe folgendes Problem.
Ich erwarte vom Spieler, dass er eine Eingabe tätigt.
Zur Wahl stehen ihm die Integer 1, 2 oder 3.
Mein Programm soll nun prüfen, ob die Eingabe gültig ist.
Gültig sollen nur diese 3 Ziffern sein und alle anderen Zeichen (Buchstabe, Sonderzeichen, Zahlen) nicht.
Für alle anderen Zahlen als 1, 2 und 3 habe ich folgenden Code:
else if(level > 3 || level < 1) { cout << "Ihre Eingabe ist ungueltig!\n"; _getch(); goto Leveleingabe; }
und für fehlerhafte Eingabe folgenden Code:
else if(cin.fail()) { cout << "Ihre Eingabe ist ungueltig!\n"; _getch(); eingabeloeschen(); cin.clear(); cin.ignore(1000, '\n'); goto Leveleingabe; }
Beides löst mein Problem, ABER sobald ich beide Schleifen in meinen Code setze (ich blende immer die andere beim Testen aus, indem ich es als Kommentar zwischen "/* ... */" setze), habe ich ein Problem und zwar es entsteht eine Endlosschleife. Um es auszuprobieren kann ich Euch mal den ganzen Code hier zeigen (bin noch am Anfang - also Code noch unvollständig!):
#include "stdafx.h" #include <iostream> #include <conio.h> #include <windows.h> #include <math.h> #include "ctime" using namespace std; int b,h,i,x,y,level; //global int feld [100][100]; void gotoxy(int x,int y) { HANDLE hConsole; COORD cursorLoc; std::cout.flush(); cursorLoc.X = x; cursorLoc.Y = y; hConsole = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleCursorPosition(hConsole, cursorLoc); } void eingabeloeschen() { int i = 0; gotoxy(0,0); do { std::cout << " \n"; i++; } while(i<8); gotoxy(0,0); } void felderstellen() { for(y=0; y<b+2; y++) { gotoxy(0,y); cout<<"#"; gotoxy(b+1,y); cout<<"#"; } for(x=0; x<h+2; x++) { gotoxy(x,0); cout<<"#"; gotoxy(x,h+1); cout<<"#"; } for (x=1; x<b+1; x++) { for (y=1; y<h+1; y++) { feld[x][y] = 0; // Spielfeld = 0 -> Wasser gotoxy(x,y); cout << "~"; // Wasser -> ~ } } } int _tmain(int argc, _TCHAR* argv[]) { Leveleingabe: cout << "Waehlen Sie eine Schwierigkeitsstufe aus:\n"; cout << "Einfach (1)\nMittel (2)\nSchwer (3)\n"; cin >> level; eingabeloeschen(); // löscht (0,0) bis (80,0) und (0,7) bis (80,7) und kehrt auf (0,0) zurueck if(level==1) { b = 5; h = 5; } else if(level==2) { b = 8; h = 8; } else if(level==3) { b = 12; h = 12; } else if(level > 3 || level < 1) { cout << "Ihre Eingabe ist ungueltig!\n"; _getch(); goto Leveleingabe; } else if(cin.fail()) // http://www.tutorials.de/c-c/256971-pruefen-ob-eingabe-int-ist.html oder "c++ eingabe kein int" bei google { cout << "Ihre Eingabe ist ungueltig!\n"; _getch(); eingabeloeschen(); cin.clear(); cin.ignore(1000, '\n'); goto Leveleingabe; } felderstellen(); _getch(); return 0; }
Ich hoffe Ihr könnt mein Problem lösen!
lg- Typ geändert Ionut DumaModerator Montag, 24. März 2014 15:45 Warten auf Antwort
Alle Antworten
-
Hallo fener000,
Erstens Du sollst GOTO nirgendwo in Deinem Code benutzen
#include <iostream> #include <conio.h> #include <windows.h> #include <math.h> #include "ctime" using namespace std; int b,h,i,x,y,level; //global int feld [100][100]; void gotoxy(int x,int y) { HANDLE hConsole; COORD cursorLoc; std::cout.flush(); cursorLoc.X = x; cursorLoc.Y = y; hConsole = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleCursorPosition(hConsole, cursorLoc); } void eingabeloeschen() { system("cls"); } void felderstellen() { for(y=0; y<b+2; y++) { gotoxy(0,y); cout<<"#"; gotoxy(b+1,y); cout<<"#"; } for(x=0; x<h+2; x++) { gotoxy(x,0); cout<<"#"; gotoxy(x,h+1); cout<<"#"; } for (x=1; x<b+1; x++) for (y=1; y<h+1; y++) { feld[x][y] = 0; // Spielfeld = 0 -> Wasser gotoxy(x,y); cout << "~"; // Wasser -> ~ } } int main() { bool ok = true; while(ok) { cout << "Waehlen Sie eine Schwierigkeitsstufe aus:\n"; cout << "Einfach (1)\nMittel (2)\nSchwer (3)\n"; cin >> level; ok = false; eingabeloeschen(); // löscht (0,0) bis (80,0) und (0,7) bis (80,7) und kehrt auf (0,0) zurueck switch (level) { case 1: b = 5; h = 5; break; case 2: b = 8; h = 8; break; case 3: b = 12; h = 12; break; default: cout << "Ihre Eingabe ist ungueltig!\n"; _getch(); eingabeloeschen(); ok = true; break; } } felderstellen(); _getch(); return 0; }
Gruss,
Ionut
Ionut Duma, MICROSOFT
Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip„Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.
-
Es ist sehr fehleranfällig, die Variablen x und y einmal als global zu definieren und an anderer Stelle lokal in einer Funktion zu verwenden.
void gotoxy(int x,int y) { HANDLE hConsole; COORD cursorLoc; std::cout.flush(); cursorLoc.X = x; cursorLoc.Y = y; hConsole = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleCursorPosition(hConsole, cursorLoc); }
In deinem Fall ist es zwar "unproblematisch" aber wenn du z.B. die Parameter "int x, int y" umbenennst, und vergisst, die Zuweisungen von cursorLoc.X bzw. cursorLoc.Y zu aktualisieren, lässt sich das Programm kompilieren und rechnet mit falschen Werten.