Probleme beim leeren des Tastaturpuffer in einer Schleife
-
Hallo,
ich bin gerade dabei ein Tutorial durchzugehen. Leider wird es in dem Beispiel nicht erklärt, wie das funktioniert bzw. es wird gar nicht gemacht. Generell ist es ein einfaches Programm um eine Schleife mit while zu erklären. Problem dabei ist nur, das in der Ausgabe der Text immer doppelt kommt.. Hier mal der Code:
#include <stdio.h> int main() { char auswahl; int ende; ende = 0; while (!ende) { printf("Waehlen Sie zwischen a, b, c und e!\n"); printf("Geben Sie ihre Auswahl ein: "); scanf("%c", &auswahl); switch (auswahl) { case 'a': printf("Sie haben a gewaehlt!"); break; case 'b': printf("Sie haben b gewaehlt!"); break; case 'c': printf("Sie haben c gewaehlt!"); break; case 'e': printf("Sie haben das Programm beendet!"); ende = 1; break; } } return 0; }
Ich habe nun alles mit fflush(stdin); versehen, was mir relevant vorkommen würde, die "printf's" werden aber immernoch doppelt ausgegeben:
#include <stdio.h> int main() { char auswahl; int ende; ende = 0; while (!ende) { printf("Waehlen Sie zwischen a, b, c und e!\n"); fflush(stdin); printf("Geben Sie ihre Auswahl ein: "); fflush(stdin); scanf("%c", &auswahl); fflush(stdin); switch (auswahl) { case 'a': printf("Sie haben a gewaehlt!"); fflush(stdin); break; case 'b': printf("Sie haben b gewaehlt!"); fflush(stdin); break; case 'c': printf("Sie haben c gewaehlt!"); fflush(stdin); break; case 'e': printf("Sie haben das Programm beendet!"); fflush(stdin); ende = 1; break; } } return 0; }
Kann mir da vll einer helfen
-
Anstatt irgendwelchen Schwachsinn über Tastaturpuffer zu erzählen, sollten deine Tutorialautoren lieber mal scanf richtig erklären:
scanf("%c", &auswahl); // zu scanf(" %c", &auswahl); // schon funktioniert es wie gewünscht
Aber wahrscheinlich wissen solche Autoren es selber nicht besser.
Mag sein, dass irgendwo im Betriebssystem oder in der Tastatur ein Pufferspeicher sitzt. Aber ein (standardkonformes) C-Programm hat da drauf absolut keinen Zugriff. Das weiß nicht einmal ob es an einer Tastatur sitzt oder ob die Daten aus einer Datei kommen oder von einem Telegrafen per Morsecode eingegeben werden. Das Programm sieht nur einen Strom von Zeichen, die in das Programm reinkommen und einen Strom von Zeichen, in den es seine Ausgaben schreiben kann. Alles ohne jede Information darüber, wo die Zeichen herkommen, wann sie gekommen sind oder wo sie hingehen. Gerede über einen Tastenpuffer sind in einem C-Programm daher Unsinn und die Vorstellung führt zu fehlerhafter Programmlogik.
-
Tatsächlich
nur zu meinem Verständnis: Das Leerzeichen vor dem % bewirkt nun genau was? Danke!!
-
-
Mit dem
scanf("%c", &auswahl);
liest du das eingegebene Zeichen ein.
Allerdings steht im Eingabestrom noch das '\n' von der Entertaste.
Das hast du im zweiten Durchlauf eingelesen. Da das nicht in deinencase
war, kam dann gleich der nächste Durchlauf.Bei den meisten Formatspecifiern überliest
scanf
dieses '\n' (bzw. auch die anderen Whitespace).
Beim%c
allerdings nicht, da es ja sein könnte, dass du genau das '\n' damit haben willst.Das Leerzeichen im Formatstring teilt
scanf
mit, erstmal alle Whitespace zu überlesen.Das
fflush(stdin)
ist nicht im C-Standard enthalten und es funktioniert nur auf wenigen Betriebssystemen.
-
ok, vielen Dank!