Was macht fflush und warum benötigt man es in folgendem Fall?
Das ist das Programm (C++), um das es geht.
int main(void)
{
int a,b;
scanf("%i", &a);
scanf("%i", &b);
printf("Die Summe von %i und %i ist %i.", a, b, a+b);
fflush(stdin);
getchar();
return 0;
}
Und jetzt frage ich mich, wozu ich das fflush(stdin) benötige. Ich weiß, dass es den Speicher löscht, also in dem Fall halt das was mit der Standardeingabe, sprich Tastatur, eingegeben wurde. Und dass wenn man es weglässt, sich das Fenster auch mit getchar sofort wieder schließt ohne dass man von dem printf viel mitkriegt, aber ich verstehe nicht warum.
getchar sorgt doch eigentlich dafür, dass sich das Fenster erst bei Drücken von Enter wieder schließt, oder? Klar, nach jedem scanf muss man zum Bestätigen der Zahl Enter drücken. Nimmt das zweite Enter dann gleich getchar, oder wie?
Und dann hätte ich noch eine Frage. Da fflush(stdin), nach dem was viele sagen, eigentlich undefiniertes Verhalten hat, auch wenn viele Compiler es trotzdem schlucken...was soll es denn normal machen? Ich hab irgendetwas mit Puffer gelesen, aber kapiert habe ich es nicht. Wäre nett, wenn mir das auch jemand erklären könnte.
2 Antworten
fflush leert einen Stream, wenn noch was drin ist.
stdin ist der Standard-Eingabe-Strom. Bei einer Konsolenanwendung kommen hier die Tastatureingaben rein. Und Tastatureingaben können theoretisch alles sein was man in der Tastatur so eingeben kann. Nicht nur Buchstaben, auch Sonderzeichen, Leerzeichen, sogar Enter ist eine Eingabe.
scanf wartet auf eine Tastatureingabe (afaik bis ein Enter in stdin kommt), schaut sich den Inhalt von stdin an und holt die Eingabe raus (hier ein Integer).
printf schreibt dann die Ausgabe in den Standard-Ausgabe-Stream (stdout).
Jetzt wirds interessant: scanf holt die Zahl aus stdin heraus. getchar macht prinzipiell das gleiche, nur holt getchar ein Zeichen, egal was es ist (ob Ziffer, Buchstabe, Leerzeichen oder sonstwas) und interpretiert es als char. stdin ist nach scanf nicht unbedingt leer. Da ist vielleicht noch ein Leerzeichen drin, oder das Enter-Zeichen (oder ein String-Terminalsymbol). Deswegen fragt getchar den User nicht nach einer Eingabe (und verhindert so dass die Konsole geschlossen wird), sondern konsumiert stillschweigend aus stdin. Das fflush verhindert das undem es den verbliebenen Inhalt von stdin verwirft, sodass getchar fragen muss.
Wenn du mehrere getchars hintereinander machst würde es auch gehn (bis stdin leer ist und dann noch ein weiteres), aber so ists schöner.
Mach einfach mal ein getchar (ohne fflush vorher), speichere getchars Ergebnis in ein int und gib es mit printf aus. In einer ASCII-Tabelle kannst du dann nachschlagen welches Zeichen da noch im Stream war
Hab ich gemacht. Sagt mir dann ganz jovial, dass es das Enter nach scanf schluckt. Nach ein bisschen Nachdenken hab ich auch verstanden wieso.
Das mit den zwei getchars hab ich vorher schon mal probiert, aber bis eben konnte ich mir nicht erklären, wieso das jetzt funktioniert.
Danke auf jeden Fall!
Wie der gute Faron schon sagte aber der weiss eh Alles :)
Ergänzen könnte man noch, dass es sich eigentlich nicht um C++ handelt, sondern eher um C. C++ bietet die hier andere Funktionen bzw. Objekte wie cout und cin.
Ja, sorry. Von der Schule aus benutzen wir Dev-C++ und da bin ich dann halt von C++ ausgegangen. Aber danke für die Info.