Concetti Chiave

  • La funzione scanf() è essenziale nel linguaggio C per leggere input dalla tastiera e memorizzarlo in variabili.
  • scanf() termina l'input quando incontra uno spazio o il segnale EOF, ma può causare problemi di buffer overflow se non gestita correttamente.
  • Per prevenire il buffer overflow, è consigliabile utilizzare scanf_s, specificando la lunghezza dell'input, o aggiungere la direttiva _CRT_SECURE_NO_WARNINGS.
  • La gestione del buffer è fondamentale poiché i caratteri vengono letti senza svuotare il buffer, portando a risultati imprevisti in letture successive.
  • Tra le tecniche per gestire il buffer, si possono usare getchar(), fflush()/fpurge(), o la direttiva #define FFLUSH per svuotarlo efficacemente.

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.

Problemi di buffer overflow

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) ;

Gestione del buffer

Immettendo i caratteri, questi vengono letti e memorizzati nel buffer (area di memoria) uno alla volta. I caratteri vengono letti dal buffer senza svuotarlo perciò se ci sono letture successive del buffer possono esserci risultati inaspettati.

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');

Domande da interrogazione

  1. Qual è la funzione principale di scanf() in C?
  2. La funzione scanf() è utilizzata per leggere input dalla tastiera e memorizzarlo in una o più variabili, come indicato nel testo.

  3. Quali problemi possono sorgere con l'uso di scanf() e come possono essere risolti?
  4. Possono verificarsi problemi di buffer overflow se i dati superano le dimensioni del buffer. Questo può essere risolto utilizzando la direttiva _CRT_SECURE_NO_WARNINGS o impiegando scanf_s, specificando la lunghezza dell'input.

  5. Come si può gestire correttamente il buffer durante l'uso di scanf()?
  6. Per gestire il buffer, è possibile leggere anche caratteri di spazio o a capo, svuotare il buffer tra le letture con funzioni come getchar() o fflush(), oppure utilizzare la direttiva #define FFLUSH per garantire letture corrette.

Domande e risposte

Hai bisogno di aiuto?
Chiedi alla community