fflush(stdin)



  • Hallo !

    Ich habe schon des öfteren gelesen, das fflush(stdin) zwar von Microsoft unterstützt wird, aber nicht unbedingt von anderen Systemen.
    Die FAQ und diverse Beiträge hier habe ich dazu durchgeblättert und dabei bin ich auf eine Alternative zu fflush(stdin) gestoßen:

    int c; // int c, nicht char c. 
    while ((c = getchar()) != EOF && c != '\n'); // kein {} block, stimmt so
    

    Warum wird zusätzlich zu EOF auch noch '\n' abgefragt ?

    Wäre alternativ

    fseek(stdin,SEEK_END, SEEK_SET);
    

    ausreichend ?

    MfG

    Der Portable.



  • der portable schrieb:

    int c; // int c, nicht char c. 
    while ((c = getchar()) != EOF && c != '\n'); // kein {} block, stimmt so
    

    Warum wird zusätzlich zu EOF auch noch '\n' abgefragt ?

    bei einer datei markiert EOF für gewöhnlich das ende, bei einer eingabe über stdin aber ist es '\n' (newline), also eingabe bestätigen (aka enter).

    der portable schrieb:

    Wäre alternativ

    fseek(stdin,SEEK_END, SEEK_SET);
    

    ausreichend ?

    sowas gibts nicht bzw. normalerweise sieht das so aus

    fseek(s, 0, SEEK_END);
    

    aber du willst ja den puffer entleeren, dafür nimmt man dann die methode mit der while schleife.



  • bei stdin kannst du meistens das ende nicht vorhersehen. also macht fseek ans ende keinen sinn.

    wuerdest du bei der while schleife gleich bis EOF lesen, wuerdest du auch alle weiteren eingaben verwerfen und der naechste einleseversuch (meinetwegen scanf) wuerde abbrechen weil EOF.



  • sollte man nicht lieber so programmieren das man das überhaupt nicht braucht?



  • aps schrieb:

    sollte man nicht lieber so programmieren das man das überhaupt nicht braucht?

    naja wird schwer, wenn man bedenkt dass man es schon für eine einfaches

    int main()
    {}
    

    benötigt.

    hier wird nämlich sofort das programm wieder beendet (das programm macht zwar eh nix aber das problem hat man auchbei anderen konsolenanwendungen). da er im FAQ nachgeschaut hat denk ich mal er hat sich "Warum schliesst die Konsole immer" oder wie das auch heisst durchgelesen und hat daher auch das bsp.



  • der portable schrieb:

    int c; // int c, nicht char c. 
    while ((c = getchar()) != EOF && c != '\n'); // kein {} block, stimmt so
    

    Hallo,

    http://home.fhtw-berlin.de/~junghans/cref/FUNCTIONS/getchar.html
    http://www.pronix.de/pronix-783.html

    Gruß



  • Ich stimme aps da zu. Wenn man von der Standardeingabe einliest, empfiehlt sich, die Eingabe zeilenweise zu verarbeiten, so dass gar keine Rückstände im stream bleiben. Das bedeutet,

    int x;
    
    scanf("%d", &x);
    

    wird ersetzt durch

    int x;
    char buf[100];
    
    fgets(buf, 100, stdin);
    sscanf(buf, "%d", &x);
    

    ...oder ggf. eine dynamische Lösung wie GNU's getline. So in der Art jedenfalls.



  • Danke für die Antworten ! 🙂


Anmelden zum Antworten