2009-08-09 15 views

risposta

6

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

buona discussione del tema qui- http://cboard.cprogramming.com/c-programming/109243-scanf-vs-fgets.html

How do you allow spaces to be entered using scanf? (che era il mio gemello cattivo sempre insegnato per dimenticare questo- non io)

+1

Per i tipi numerici, scanf() non deve eseguire il controllo dei limiti. Per i tipi di stringa, puoi dire a scanf() di effettuare il controllo dei confini. –

1

scanf analizza una stringa si legge nel (o creato), e Fgets legge una riga da un FILE aperto *. O intendi fscanf?

+1

puoi leggere dallo standard input (console) con fgets. –

20

Ci sono molte differenze. Due quelli cruciali sono:

  • fgets() può leggere da qualsiasi file aperto, ma scanf() legge solo standard input.
  • fgets() legge 'una riga di testo' da un file; scanf() può essere utilizzato 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 utilizzare sscanf() per sezionarlo.

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

scanf (3) cercati certo modello definito dal formato argomento sull'ingresso proposta nota come stdin, dove il modello è definito da te. 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 linea dal file di input flusso e copiare i byte stringa terminazione nullo al buffer str e limitano l'uscita al buffer a determinate byte in dimensioni.

0

La differenza principale risiede nel fatto che scanf non ha limiti sul numero di caratteri che possono essere letti (nel suo utilizzo predefinito), mentre fgets ha un numero massimo di char che può essere letto.

Vedi il prototipo delle due funzioni:

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

int scanf (formato const char *, ...);

Si può vedere che il secondo parametro di fgets impone di leggere al massimo char dimensioni.

Un'altra differenza evidente è il valore di ritorno: fgets ritorno un puntatore a dest in caso di successo; scanf restituisce il numero di elementi di input correttamente abbinati e assegnati. Quindi, la funzione scanf scansioni ingresso secondo formato, e legge input dal flusso di input standard stdin, mentre fgets legge input da FILE * stream come predefinito.

In conclusione, è possibile 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 i file legge e restituisce fino a \n (incluso), aggiungendo un \0 alla fine come un terminatore di stringa.

0

Va notato che scanf spec modello CONSENTONO limiti larghezza campo:

scanf(" %80s", mybuffer); 

Ma, dove printf() permette la larghezza da passare come variabile (con '*'):

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

scanf() no. (E interpreta il '*' come una bandiera per sopprimere/ignorare il campo del tutto.) Il che significa che si finisce per fare cose come questa:

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

e non c'è modo di collegare il campo Larghezza 40 nel scanf() con la larghezza del buffer 40 nella dichiarazione del buffer.