C fflush(stdin)
-
Hallo,
wie kann ich unter Linux den Tastatur Puffer leeren, ein fflush(stdin) funktioniert leider nicht.
Unter Windows mit dem lcc Compiler geht es wie erwartet, unter Linux mit gcc version 2.95.4 leider nicht, das CR Zeichen von der Int-Eingabe ist noch im Puffer und wird von scanf in die Variable c gelesen.Gruss Rupert
Beispiel:
#include<stdio.h> #include<stdlib.h> int main(void){ int a; char c; printf("Zahl eingeben: ") ; scanf("%d",&a); printf("Zeichen eingeben: "); fflush(stdin); scanf("%c",&c); printf("\n Zahl: >%d< \n",a); printf("\n Zeichen: >%c< \n",c); return 0; }
-
fflush(stdin) hat laut Standard undefiniertes Verhalten, wenn es unter DOS geht, ist das Zufall. Eine Möglichkeit wär so: int c; do c = getchar(); while (c != EOF && c != '\n');
Es wird BTW im Normalfall kein CR-Zeichen ('\r') gelesen. Du meinst sicher LF bzw. NL ('\n').
-
du kannst das auch mit termios machen
-
Für das Programm, das du dargestellt hast, halte ich folgende Lösung für die sinnvollste:
char c, buffer[8]; printf("Zeichen eingeben: "); scanf("%7s", buffer); c = buffer[0];
Martin
-
oder
scanf("%d\n",&foo);
weil das \n dann direkt mit eingelesen wird
-
Ich darf gerade einen C Kurs besuchen, und wir verwenden dort fflush. Der Kursleiter kommt nicht aus der PC Welt, fflush() scheint also auch auf anderen Systemen zu funktionieren.
Danke fuer euere schnelle Hilfe.@Bashar:
Dein Beispiel funktioniert gut, Danke.
Ja es ist das LF-Zeichen (0xA), aber woher kommt dass, ich dachte immer Enter ist bei Linux/Unix nur CR (0xD)?@kingruedi:
bei deiner Loesung bekomme ich nicht wie erwartet die zweite Meldung ("Bitte Zeichen eingeben") wuerde sonst aber funktionieren.@Martin G
Ja auch das funtioniert, allerdings muss man auf das zweite Element des Arrays zugreifen, da im ersten wieder das LF Zeichen ist.char c, buffer[2]; printf("Zeichen eingeben: "); scanf("%2s", buffer); c = buffer[1];
-
rup schrieb:
Ich darf gerade einen C Kurs besuchen, und wir verwenden dort fflush. Der Kursleiter kommt nicht aus der PC Welt, fflush() scheint also auch auf anderen Systemen zu funktionieren.
Es geht nicht um fflush, sondern um fflush(stdin). Ich zitiere aus dem C99-Standard(Draft):
[#2] If stream points to an output stream or an update
stream in which the most recent operation was not input, the
fflush function causes any unwritten data for that stream to
be delivered to the host environment to be written to the
file; otherwise, the behavior is undefined.