char * fgets (char * str, int num, FILE * stream);
è sicuro da usare perché evita il problema buffer overflow, esegue solo la scansione del numero num-1
.
legge caratteri dal flusso e li memorizza come stringa C in str fino caratteri (num-1) sono stati letti o viene raggiunto sia una nuova linea o il file di fine, se precedente.
qui secondo argomento num
è Numero massimo di caratteri da copiare in str (incluso il carattere null di chiusura).
Ad esempio, nel codice, una capacità di stringa di array è pari a 5
caratteri come indicato di seguito.
char str[5];
fgets (str, 5, fp); //5 =you have provision to avoid buffer overrun
Utilizzando sopra il codice, se l'ingresso da fp
è più lungo 4
caratteri, fgets()
leggerà appena prima 4
caratteri poi aggiunge \0
(, e scartare altri caratteri di input supplementari, solo memorizza cinque char in str[]
).
considerando scanf(" %[^\n]",str);
leggerà fino \n
non trovato e se la stringa di input è più lungo 4
caratteri scanf()
causerà di buffer overflow (come scanf
cercherà di accedere alla memoria oltre indice max 4
in str[]
).
fonte
2013-06-25 10:25:22
dovrebbe essere scanf ("% [^ \ n]", linea); chiudi il tutore nell'argomento .. –
Lo è assolutamente. Suggerisco sempre di usare 'fgets()' ed evitare 'scanf()' completamente. –
@RaghuSrikanthReddy Esempio perfetto del motivo per cui 'scanf()' non deve essere usato. –