Was macht fflush und warum benötigt man es in folgendem Fall?

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

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


Mayonara 
Fragesteller
 27.10.2013, 11:34

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!

0

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.

Woher ich das weiß:Berufserfahrung – Softwareentwickler/Projektleiter seit 2012

Mayonara 
Fragesteller
 27.10.2013, 11:23

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.

0