Probelma fgets()

di Anonimizzato13936 il
16 risposte
Come faccio a svuotare il buffer della scanf?
per intenderci se chiamo una scanf prima di una fgets:
esempio:
char s[10];
int i;
scanf("%d",&i);
fgets(s,10,stdin);
printf(s);

rimane bufferizzato l'invio che do per memorizzare l'intero nella scanf e non mi fa inserire la stringa

16 Risposte

  • Una funzione di questo tipo dopo ogni scanf dovrebbe funzionare:
    
    void
    clear (void)
    {
      while ( getchar () != '\n' );
    }
  • Cerca di evitare la fscan(): non è sicura in quanto non ha limiti nei caratteri che legge (se le passi una stringa di 10 caratteri, se l'utente inserisce 11 caratteri per lei va bene lo stesso, ma tu sfori nel tuo buffer!)
    Usa sempre gets() o fgets().
    Se vuoi leggere un intero puoi fare atoi(gets(buff...)).
    Il buffer (nel tuo caso s[]) non farlo della dimensione esatta che ti serve! Considera che l'utente potrebbe inserire tanti caratteri... metti ad esempio char s[80];
    Dati questi suggerimenti, riscrivi così:
    char s[80];
    int i;
    fgets(s,80,stdin);
    i = atoi( s );
    printf( "%d\n", i );
    fgets(s,80,stdin);
    printf(s);
  • Infatti funziona pero non mi è chiaro cosa fa
  • Si altrimenti potrei imbattermi in un bufferoverflow ma quindi è rischioso anche per acquisire un intero?
  • Io mi sento di sconsigliare l'utilizzo di fflush(stdin), in quanto il suo comportamento, quando viene passato come parametro stdin è non definito.

    http://www.gidnetwork.com/b-57.htm
  • Ma con un while( getchar()!='\n'); dopo ogni scanf il problema viene risolto no?
  • Si mettendo qulla funzione dopo ogni scanf funziona ma cosa fa esattamente while(getchar() != `\n')???
  • Qui c'è un esempio che dovrebbe chiarire:
  • Il consiglio è molto semplice: non usare scanf()!!!
  • Atoi acquisisce anche double?
  • Usa atof()
  • Per i caratteri semplicemente getchar?
  • Prendi il primo carattere del buffer che leggi con fgets()
  • Sarebbe meglio comprare un buon manuale,i nomi comunque sono quasi semplici:

    atoi == AsciToInteger
    atof == AsciToFloat

    e cosi via.
Devi accedere o registrarti per scrivere nel forum
16 risposte