Concetti Chiave
- La funzione scanf() in C, dichiarata in stdio.h, legge input dalla tastiera e lo assegna a variabili.
- scanf() termina la lettura quando incontra uno spazio o EOF, eccetto nel caso del tipo %c.
- Il buffer overflow è un rischio con scanf() se l'input supera la capacità del buffer.
- Per gestire il buffer overflow, si può usare scanf_s specificando la lunghezza dell'input o aggiungere la direttiva _CRT_SECURE_NO_WARNINGS.
- Per evitare letture errate dal buffer, si consiglia di svuotarlo tra le letture con getchar(), fflush()/fpurge(), o rewind(stdin).
Funzione scanf()
La funzione scanf() è una delle funzioni principali usate in C ed è dichiarata nel file header stdio.h.
Questa funzione legge la variabile messa come input dalla tastiera e la mette in una o più variabili.
È possibile inserire tutti i caratteri eccetto quelli di spaziatura, eccetto nel tipo %c.
scanf() termina quando viene digitato uno spazio o EOF.
Ci possono essere problemi di buffer overflow anche con scanf(), quando il dato supera le dimensioni di quella del buffer dove viene memorizzato, le cifre in eccedenza sovrascrivano altre variabili o causando un errore di segmentazione.
Questo problema si può risolvere:
- Aggiungendo la direttiva _CRT_SECURE_NO_WARNINGS
- Utilizzando scanf_s dove occore specificare la lunghezza dell’input
scanf_s ("%s", string ,10) ;
Immettendo i caratteri, questi vengono letti e memorizzati nel buffer (area di memoria) uno alla volta.
Per risolvere questo problema:
- Inserire nello scanf() anche caratteri di spazio o a capo che devono essere letti
- Svuotare il buffer tra le diverse letture con determinate funzioni: getchar(), fflush()/fpurge(), rewind(stdin).
- Usare la direttiva #define FFLUSH while ( getchar () != '\n');