Problem do..while || switch..case
-
Hallo!
Habe dieses Programm geschrieben, verstehe einen Fehler nur nicht:Wenn keiner der geforderten Buchstaben eingegeben wird, soll die Eingabe erneuert werden. Wieso aber wird in der Ausgabe die Zeile
Falsche Eingabe (j,J,y,Y,n,N)
doppelt ausgegeben. Wenn ein Umlaut eingegeben ist sogar dreifach??
Ich kapiere es nicht!!!
#include <stdio.h> int main(void) { char eingabe; int ja=3; printf("Ja oder nein? "); do { scanf("%c", &eingabe); switch(eingabe) { case 'j' : ja=0; break; case 'J' : ja=0; break; case 'y' : ja=0; break; case 'Y' : ja=0; break; case 'n' : ja=1; break; case 'N' : ja=1; break; default : printf("Falsche Eingabe (j,J,y,Y,n,N)\n"); } } while (ja==3); if (ja==0) printf("Sie haben ja gewaehlt!\n"); if (ja==1) printf("Sie haben nein gewaehlt!\n"); return 0; }
-
Mach mal nen fflush(stdin); nach scanf("%c", &eingabe);
damit das \n gelöscht wird, was mit eingegeben wurde.Also:
... scanf("%c", &eingabe); fflush(stdin); ...
-
fflush(stdin) funktioniert eher zufällig mit dem MS Compiler, laut Standard flusht fflush nur Ausgabeströme. Mit dem gcc zum Beispiel hat fflush(stdin); keinen Effekt. Das ganze lässt sich nur mit gebufferter Eingabe sinnvoll umgehen, also zum Beispiel:
#include <ctype.h> #include <stdio.h> #define BUFLEN 100 int main(void) { char buf[BUFLEN]; int ja = -1; do { printf("Ja oder Nein? "); fflush(stdout); /* sofortige Ausgabe erzwingen */ /* eine Zeile einlesen */ fgets(buf, BUFLEN, stdin); /* Wenn buf[1] != '\n' ist, wurde mehr als ein Zeichen eingegeben */ if(buf[1] != '\n') continue; switch(tolower(buf[0])) { case 'y': case 'j': ja = 1; break; case 'n': ja = 0; break; default: puts("Falsche Eingabe (j,J,y,Y,n,N)"); } } while(ja < 0); if(ja) puts("Sie haben ja gewählt!"); else puts("Sie haben nein gewählt!"); return 0; }
-
fflush(stdin) funktioniert eher zufällig mit dem MS Compiler, laut Standard flusht fflush nur Ausgabeströme. Mit dem gcc zum Beispiel hat fflush(stdin); keinen Effekt.
Ah, das erklärt auch, warum ich letztens nem Kumpel, der gcc benutzt hat, nicht helfen konnte und warum es bei mir (VC++) ging. Gut zu wissen. Tjo, dann muss man wirklich mit nem buffer arbeiten.