Differenza tra scanf () e fgets ()

Voglio sapere qual è la differenza tra fgets() e scanf() . Sto usando C come mia piattaforma.

Ci sono molte differenze. Due cruciali sono:

  • fgets() può leggere da qualsiasi file aperto, ma scanf() legge solo input standard.
  • fgets() legge ‘una riga di testo’ da un file; scanf() può essere usato per questo, ma gestisce anche le conversioni da stringa a tipi numerici incorporati.

Molte persone useranno fgets() per leggere una riga di dati e quindi usare sscanf() per sezionarlo.

Scanf non esegue il controllo dei limiti. Fgets sarà probabilmente la scelta migliore. È quindi ansible utilizzare sscanf () per valutarlo.

Buona discussione sull’argomento qui- http://cboard.cprogramming.com/c-programming/109243-scanf-vs-fgets.html

Come si consente di inserire gli spazi utilizzando scanf? (Quello era il mio malvagio gemello che ha fatto le conferenze per aver dimenticato questo, non io)

 int scanf(const char * restrict format, ...); 

scanf (3) cerca determinati pattern definiti dall’argomento format sull’input dato noto come stdin , in cui il pattern è definito dall’utente. L’input dato a scanf (3) , a seconda della sua variante (scanf, fscanf, sscanf, vscanf, vsscanf, vfscanf), potrebbe essere una stringa o un file.

 char *fgets(char * restrict str, int size, FILE * restrict stream); 

fgets (3) legge semplicemente una riga dal stream del file di input e copia i byte come stringa di terminazione nulla sul buffer str e limita l’output al buffer a byte dati di dimensione .

scanf analizza una stringa che hai letto (o creato), e fgets legge una riga da un FILE aperto *. O intendi fscanf?

La principale differenza sta nel fatto che scanf non ha limiti sul numero di caratteri che possono essere letti (nel suo uso predefinito), mentre fgets ha un numero massimo di caratteri che possono essere letti.

Guarda il prototipo delle due funzioni:

char * fgets (char * dest, int size, FILE * stream);

int scanf (const char * format, …);

Potete vedere che il secondo parametro di fgets impone di leggere al massimo la dimensione del carattere.

Un’altra chiara differenza è il valore di ritorno: fgets restituisce un puntatore a dest in caso di successo; scanf restituisce il numero di elementi di input correttamente abbinati e assegnati. Quindi, la funzione scanf esegue la scansione dell’input in base al formato e legge l’input dallo standard input stream stdin , mentre fgets legge l’input dallo stream FILE * come predefinito.

In conclusione, è ansible utilizzare scanf per leggere i dati da un FILE e inserirli in una matrice a dimensione fissa (ad esempio) non ha molto senso. Un vantaggio di scanf è la formattazione dei dati di output: se la funzione legge 12345\n , l’output è 12345 , mentre il file legge e ritorna fino a \n (incluso), aggiungendo un \0 alla fine come un terminatore di stringa.

Va notato che le specifiche del modello scanf consentono limiti di larghezza del campo:

 scanf( " %80s", mybuffer ); 

Ma, dove printf() consente di passare la larghezza come variabile (con ‘*’):

 printf( "My name is %*s.\n", 20, name ); 

scanf() no. (Interpreta il ‘*’ come una bandiera per sopprimere / ignorare completamente il campo.) Il che significa che si finisce per fare cose del genere:

 #define NAMEWIDTH 40 char buffer[ NAMEWIDTH + 4 ]; ... scanf( " %40x", buffer ); 

e nessun modo per colbind la larghezza del campo 40 nella scanf() con la larghezza del buffer 40 nella dichiarazione del buffer.