Eingaben von Konsole einlesen?!
-
Hallo,
ich beschäftige mich seit einiger Zeit mit der Sprache C. Nachdem ich schon einige Monate mit Objective-C programmiert habe, dachte ich mir, ich sehe mir mal C genauer an...Nun habe ich ein kleines Problem, dass ich mir einfach nicht erklären kann und bitte deswegen um eure Hilfe.
int main(int argc, const char * argv[]) { char derBefehl; while ( ((derBefehl = EingabeAuswerten() ) != 'q' ) && ((derBefehl = EingabeAuswerten() ) != 'Q') ) { switch (derBefehl) { case 'N': case 'n': printf("***Eingabe erkannt: N***\n"); break; case 'L': case 'l': printf("***Eingabe erkannt: L***\n"); break; case 'H': case 'h': printf("***Eingabe erkannt: H***\n"); break; } } printf("***Eingabe erkannt: Q***\n"); printf("Out!\n"); return 0; } char EingabeAuswerten ( void ) { char meineEingabe; do { printf("Ihre Eingabe bitte: "); scanf("%c", &meineEingabe); while (getchar() != '\n') { ; } } while ( (meineEingabe != 'n' ) && (meineEingabe != 'l') && (meineEingabe != 'h') && (meineEingabe != 'q') && (meineEingabe != 'N' ) && (meineEingabe != 'L') && (meineEingabe != 'H') && (meineEingabe != 'Q') ); printf("Ihre endgültige Eingabe: %c\n", meineEingabe); return meineEingabe; }
Mein Problem? Meine Switch Anweisung führt nur jedes zweite Mal den Befehl aus! Obwohl das auch nicht immer, wenn ich nach einem ersten Fehlversuch ein 'q' oder 'Q' eingebe braucht er noch einen Versuch mehr um den Befehl zu erkennen.
Ihre Eingabe bitte: h Ihre endgültige Eingabe: h Ihre Eingabe bitte: l Ihre endgültige Eingabe: l ***Eingabe erkannt: L*** Ihre Eingabe bitte: n Ihre endgültige Eingabe: n Ihre Eingabe bitte: l Ihre endgültige Eingabe: l ***Eingabe erkannt: L*** Ihre Eingabe bitte: n Ihre endgültige Eingabe: n Ihre Eingabe bitte: h Ihre endgültige Eingabe: h ***Eingabe erkannt: H*** Ihre Eingabe bitte: n Ihre endgültige Eingabe: n Ihre Eingabe bitte: q Ihre endgültige Eingabe: q Ihre Eingabe bitte: q Ihre endgültige Eingabe: q ***Eingabe erkannt: Q*** Out!
Als ich das ganze nur mit den kleingeschriebenen Buchstaben ('n', 'l', 'h' & 'q') versucht habe, hat es reibungslos geklappt, warum aber jetzt nicht mehr?
Habe das ganze auch mit fgets() probiert und das selbe Problem... funktioniert nur so lange ich nicht die großgeschriebenen Buchstaben mit einbeziehe.
Wie behebe ich das Problem?
Würde mich über eine hilfreiche Antwort sehr freuen!
Danke!
-
Du rufst vor dem switch zweimal! die Funktion EingabeAuswerten auf, in der beide Male eine Eingabe verlangt wird:
while ( ((derBefehl = EingabeAuswerten() ) != 'q' ) && ((derBefehl = EingabeAuswerten() ) != 'Q') )
Änderungsvorschlag:
while ( ((derBefehl = EingabeAuswerten() ) != 'q' ) && (derBefehl != 'Q') )
-
Haha, habe minutenlang auf den code geschaut und einfach nichts gefunden, aber diese eine Zeil habe ich irgendwie blöderweise vollkommen ignoriert. Danke
Aber: Sollte es nicht auch mit meinem ursprünglichen Code funktionieren? Ist doch nichts dabei wenn ich die Funktion zwei mal aufrufe und den return wert in die selbe variable schreibe oder? Warum geht das dann nicht?
-
Weil nach dem zweiten Aufruf selbstverständlich der Wert des zweiten Aufrufs in derBefehl steht und ausgewertet wird. Nach dem ersten Aufruf wird ja noch nicht ausgewertet.
-
Belli schrieb:
Du rufst vor dem switch zweimal! die Funktion EingabeAuswerten auf, in der beide Male eine Eingabe verlangt wird:
while ( ((derBefehl = EingabeAuswerten() ) != 'q' ) && ((derBefehl = EingabeAuswerten() ) != 'Q') )
Änderungsvorschlag:
while ( ((derBefehl = EingabeAuswerten() ) != 'q' ) && (derBefehl != 'Q') )
Jap, so gehts.
Außerdem kannst du noch ein paar klammern sparen:while ( ( derBefehl = EingabeAuswerten() ) != 'q' && derBefehl != 'Q')
-
Wenn du beim ersten mal ein 'q' eingibst, ist deine erste Bedingung (!='q') für das && unwahr,
Dann ist das && sowieso unwahr und der zweite Ausdruck (!='Q') wird gar nicht ausgewertet (ausgeführt).