Buchstaben ausschließen
-
Hallo!
Ich habe für ein Spiel ein Menü erstellt. In dem Menü soll über Eingabe der 1 das Spiel, über 2 die Spielregel und über 3 Beenden abrufbar sein. Bei allen anderen Eingabe soll "Falsche Eingabe!" erscheinen, und nach einem Tastendruck soll das Fenster mit der Eingabemöglichkeit neu angezeigt werden. Das funktioniert aber nur bei Zahlen, sobald ich einen Buchstaben eingebe, kommt noch "Falsche Eingabe!" und bei einem Tatsendruck öffnet sich auch das Fenster neu, aber es kann nichts mehr eingegeben werden. Es steht dann immer schon "Falsche Eingabe!" dort. So geht das dann auch immer weiter.
Wie kann ich das umsetzen, das auch wenn ich Buchstaben eingebe das Fenster neu angezeigt wird und ich wieder neu wählen und eingeben kann?
Das ist meine bisherige Funktion
void Menue()
{
int auswahl = 0;
printf("Sie befinden sich im Menue. Druecken Sie die entsprechende Zahl.");
printf("(1) Spielen, (2)Regeln, (3) Beenden. Ihre Auswahl:");
scanf("%d", &auswahl);switch(auswahl)
{
case 1:
system("Cls");
Spielen();
break;
case 2:
system("Cls");
Regeln();
break;
case 3:
printf("Bis zum naechsten Mal!");
system("Pause");
break;
default:
printf("Falsche Eingabe!");
system("Pause");
system("Cls");
Menue();
}
}Freue mich über Antworten!
Gruß
-
Das grundlegende Problem ist, dass scanf die Buchstaben nicht aus dem Eingabestrom holt, weil sie nicht in %d passen. Beim nächsten Einleseversuch sind diese noch da, und das Einlesen schlägt erneut fehl.
Es gibt mehrere Möglichkeiten, das zu lösen. Die üblichsten sind, die Eingabe zeilenweise zu verarbeiten:
char buf[100]; ... if(fgets(buf, 100, stdin) != NULL && sscanf(buf, "%d", &auswahl) == 1) { /* Menü hier */ } else { /* Lesefehler */ }
oder nach scanf den Rest der Zeile zu ignorieren:
char c; ... scanf("%d", &auswahl); while(fread(&c, 1, 1, stdin) != 0 && c != '\n') ; if(feof(stdin) || ferror(stdin)) { /* Lesefehler */ } else { /* Menü hier */ }
-
Liebe Tamara,
es wird Dir - wie ganz vielen anderen "Neulingen" nichts anderes übrig bleiben, als Dich nach einem tollen C-Tutorial umzusehen (Oder E-book oder Onlinekurs, nenn es, wie Du magst) und Dir erstmal die Basics zu erarbeiten.
Formatkennzeichen wie %d, %c, %i, %s, %lf gehören zu diesen Basics und es steht zu befürchten, dass Du auch weitere Programme schreiben wirst, die an ähnlichen "Kleinikeiten" scheitern, weil Du sie einfach "noch nicht" kennst.
Hier im Forum gibt es einen "FAQ"-Bereich, der schonmal einiges sehr verständlich erklärt. Außerdem sind die obersten Themen hier im Forum sehr hilfreich und bieten meines Wissens einige empfehlenswerte Einführungskurse an.
-
void Menue(){ int auswahl = 0; printf("Sie befinden sich im Menue. Druecken Sie die entsprechende Zahl."); printf("(1) Spielen, (2)Regeln, (3) Beenden. Ihre Auswahl:"); scanf("%d", &auswahl); switch(auswahl){ case 1: system("Cls"); Spielen(); break; case 2: system("Cls"); Regeln(); break; case 3: printf("Bis zum naechsten Mal!"); system("Pause"); break; default: printf("Falsche Eingabe!"); system("Pause"); system("Cls"); Menue(); } }
1. fuer ein Menu kann man immer gut eine do{}while(); Schleife benutzen.
2. bei scanf(); gibt es auch eine Moeglichkeit nur Zahlen einzulesen mit scanf("%[0-9]d", &auswahl);
3. vor scanf die Funktion fflush(stdin); aufrufen um den buffer zu loeschen
-
4. Du hast eine rekursive Funktion geschrieben, wenn man immer wieder eine falsche Eingabe macht wird dein Speicher irgendwann voll sein
void Menue(){ int auswahl = 0; do{ printf("Sie befinden sich im Menue. Druecken Sie die entsprechende Zahl."); printf("(1) Spielen, (2)Regeln, (3) Beenden. Ihre Auswahl:"); fflush(stdin); scanf("%d", &auswahl); switch(auswahl){ case 1: system("Cls"); Spielen(); break; case 2: system("Cls"); Regeln(); break; case 3: printf("Bis zum naechsten Mal!"); system("Pause"); break; default: printf("Falsche Eingabe!"); system("Pause"); system("Cls"); } }while(3 != auswahl); }
-
DerMaddi schrieb:
3. vor scanf die Funktion fflush(stdin); aufrufen um den buffer zu loeschen
http://www.c-plusplus.net/forum/viewtopic.php?t=39349
Shade Of Mine schrieb:
Daraus folgt, das fflush(stdin) ein undefiniertes Verhalten an den tag legt.
Ergo lieber eine Alternative zu fflush(stdin) wählen....