stdin leeren - die Hundertste...



  • Hallo!

    Habe ja nun auch gelernt, dass man für

    fflush(stdin);
    

    gesteinigt wird. Aber die Alternativen, die ich hier im Forum gefunden habe, haben alle nicht das gemacht, was fflush auf meinem Windows-Rechner gemacht hat (nämlich einfach nur den Puffer leeren - ohne ein zusätzliches Enter oder ähnliches).

    Da is mir in den ANSI-C FAQ's bei "Automatisches Schließen verhindern" von SideWinder folgendes begegnet:

    Wer auf Punkt 2 verzichten kann (das Programm wartet dann auf das nächste "Enter") ist mit folgender standard-kompatibler Funktion gut bedient:
    C/C++ Code:

    // C-Version
    #include <stdio.h>

    void wait ()
    {
    setvbuf(stdin,NULL,_IONBF,0);
    setvbuf(stdin,NULL,_IOFBF,BUFSIZ);
    getchar();
    }

    Kurz zur Erklärung: Die C-Version ist etwas "tricky". Sie nützt den Nebeneffekt aus, dass der Puffer leer ist, wenn man zuerst die Größe auf 0 setzt und danach wieder auf die normale Größe.

    So. Kann man das

    getchar();
    

    nicht einfach weglassen, die Funktion "PufferLeeren" nennen und überall aufrufen, wo man den Puffer leer haben will?

    Oder is das irgendwie übertrieben? Bin noch Anfänger und fands bis jetzt die beste Lösung meines Problems. Wär für ein Statement dankbar!



  • Würd_gern_C_können schrieb:

    So. Kann man das

    getchar();
    

    nicht einfach weglassen, die Funktion "PufferLeeren" nennen und überall aufrufen, wo man den Puffer leer haben will?

    Ja.

    Alternative, die auf allem, was nach Stream aussieht, funktioniert:

    void ignore(FILE *f) {
      int c;
      while ( (c = fgetc(f)) != '\n' && c != EOF );
    }
    

    Aufruf für stdin:

    ignore(stdin);
    

    Have fun.



  • Danke für Deine Antwort, aber wird bei Deinem Code nicht auch ein zusätzliches Enter im Programmablauf benötigt?



  • Würd_gern_C_können schrieb:

    Danke für Deine Antwort, aber wird bei Deinem Code nicht auch ein zusätzliches Enter im Programmablauf benötigt?

    Das ist richtig.



  • Warum muss das getchar drinbleiben? Ich weiß, das hat meist nicht viel zu bedeuten, aber bei mir hats funktioniert.

    Ich ändere doch nur Größe des Puffers, um sie dann wieder auf die Standardeinstellung zurück zu setzen. Warum wird danach noch irgendeine Eingabe benötigt?

    edit: Wie? Beitrag editiert? 😃 Kann das getchar doch weggelassen werden???



  • Ja, das getchar ist für das 'Enter'. Den Puffer leerst du schon mit den zwei ersten Anweisungen. Sorry für's Edit, aber irgendwie war ich kurz verwirrt 😉



  • GPC schrieb:

    void ignore(FILE *f)
    

    ich würde so eine funktion ja eher 'purge' nennen 😉



  • da schreibt doch einer ein vokabeltrainier, da kann er das purge hinzufügen als "Starkes Abführmittel" 🙂


Anmelden zum Antworten