Visualizzazione dei risultati da 1 a 10 su 10

Discussione: [C] "Pulire" lo stdin

  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2002
    Messaggi
    2,894

    [C] "Pulire" lo stdin

    Molto spesso quando richiedo all'utente di inserire un carattere vedo chew in realtà nello stdin era già presente qualcosa e il comando non funzia bene...

    In Windows uso fflush(stdin) ma in Linux non va e cmq non credo sia del tutto corretto...

    Es.:
    codice:
    do
    {
       printf("Continuo? (y, n)");
       scanf("%c", &scelta);
    }
    while(scelta != 'y' && scelta != 'n');
    Mi stampa la frase due volte, poi comincia a funzionare bene, come se la prima volta avesse già nello stdin un carattere e quindi riesegue già una volta il ciclo...
    In Windows risolvo con fflush(stdin); messo prima del printf...


  2. #2
    penso che abbia in memoria '\n' che rimane dalla volta precedente che hai schiacciato invio....
    prova a mettere un getc() prima del do{}

    ma non sono molto sicuro, anch'io da win usavo fflush....

  3. #3
    Devi svuotare il buffer di tastiera.

    Io per acquisire un carattere uso la funzione getchar (), inclusa nel header <stdio.h>:

    codice:
           do {
                    printf ("Continuo? (y, n)\n");
                    scelta = getchar ();
                    if (getchar () != '\n')
                            while (getchar() != '\n');
            } while (scelta != 'N' && scelta != 'n');
    In questo modo svuoto il buffer da tastiera.

  4. #4
    codice:
    if (getchar () != '\n')
            while (getchar() != '\n');
    Ragiona, e` superfluo.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2001
    Messaggi
    147
    in linux lo stdin è visto con un file con file descriptor 0
    quindi l'ewuivalente del comando in win in linux diventa fflush(0)
    ciao
    Zio

  6. #6
    Non credevo si potessero aprire due discussioni uguali a distanza 1 settimana si e no eppure... come ho gia' detto altrove non puoi usare fflush() perche' forza la scrittura solo sugli output buffer (quindi stdout e stderr al limite) e questo la manpage lo dice chiaramente (almeno su freebsd ma non mi stupirei se facesse lo stesso anche su Linux). Per ovviare puoi fare una rappresentazione in questo modo:

    #define fflush(stdin) while ((getchar()) != '\n')


    spero di essere stato chiaro una volta per tutte. Non aprite 100000 thread uguali.

    bye
    There are 10 kinds of people in the world: who knows the binary numeration and who not

  7. #7
    Utente di HTML.it
    Registrato dal
    Oct 2002
    Messaggi
    2,894
    Scusate e grazie... :quipy:

  8. #8
    Utente di HTML.it
    Registrato dal
    Oct 2002
    Messaggi
    2,894
    Originariamente inviato da zioluter
    in linux lo stdin è visto con un file con file descriptor 0
    quindi l'ewuivalente del comando in win in linux diventa fflush(0)
    ciao
    Zio
    Così non funziona... Basta mettere un getchar() come prima istruzione dentro al blocco do{} che cattura lo '\n'


  9. #9
    fflush() flusha un FILE*, non un descrittore. 0 in quel caso sta per NULL. :quipy:

  10. #10
    Originariamente inviato da TheGreatWorld
    Non credevo si potessero aprire due discussioni uguali a distanza 1 settimana si e no eppure... come ho gia' detto altrove non puoi usare fflush() perche' forza la scrittura solo sugli output buffer (quindi stdout e stderr al limite) e questo la manpage lo dice chiaramente (almeno su freebsd ma non mi stupirei se facesse lo stesso anche su Linux). Per ovviare puoi fare una rappresentazione in questo modo:

    #define fflush(stdin) while ((getchar()) != '\n')


    spero di essere stato chiaro una volta per tutte. Non aprite 100000 thread uguali.

    bye
    IO avevo un problema sia con la scanf che con la getchar su processi locali, e ho risolto usando la macro che hai riportato sopra , mitico.
    Purtroppo se uso le socket il problema si ripresenta anche se in
    maniera diversa ;(

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.