L’input è la linfa vitale di qualsiasi programma interattivo. Senza di esso, stai semplicemente utilizzando una calcolatrice nel vuoto. Nel linguaggio di programmazione C, il cavallo di battaglia per acquisire dati dalla tastiera è “scanf”. È semplice. È ovunque. Ma è anche noto per essere spietato quando le cose vanno male.
Per script di base o prototipi rapidi, scanf fa il lavoro. Si legge da “stdin” (input standard). Se stai digitando su una tastiera, è lì che atterrano i tuoi personaggi. La funzione è versatile, ma manca di una solida gestione degli errori. Non importa se digiti una lettera quando si aspetta un numero. Rimarrà lì o, peggio, bloccherà il tuo programma. Ecco perché è ottimo per compiti semplici ma scadente per il software di livello produttivo.
La sintassi e la e commerciale
Consideriamo il caso d’uso più semplice possibile. Vuoi un numero intero. Lo chiedi. Lo conservi.
scanf("%d", &b);
Questo è tutto. Due argomenti. La stringa di formato e la destinazione.
Il %d dice a scanf di aspettarsi un numero intero. È lo stesso segnaposto che usi in “printf”. La variabile “b” deve essere dichiarata come “int”. Se non lo è, stai andando in cerca di guai.
Ecco la parte che ogni volta fa inciampare i principianti: la e commerciale (& ).
“&b” non è un errore di battitura. È un indicatore. Nello specifico, è l’indirizzo della variabile “b”. scanf non accetta il valore; ha bisogno della posizione di memoria in cui scrivere l’input. Dimentica “&”. Il tuo codice potrebbe essere compilato. Ma quando lo esegui? Incidente. Segfault. Vuoto. Il programma quasi sicuramente terminerà bruscamente perché tenta di scrivere su un indirizzo di memoria casuale.
Flag di formattazione
“scanf” utilizza gli stessi specificatori di conversione di “printf”. Se ne conosci uno, conosci l’altro. Ma il contesto conta.
- Interi :
%d - Numeri in virgola mobile :
%f - Caratteri singoli :
%c - Stringhe :
%s
Teneteli dritti. Scambia un %f con un numero intero e otterrai dati spazzatura o un arresto anomalo.
Perché scanf non è sufficiente
Puoi concatenare chiamate scanf per leggere più valori.
Questo funziona per i numeri. È abbastanza pulito. Ma provare a leggere un’intera riga di testo? Si rompe. scanf con %s si ferma al primo spazio bianco. Non legge l’intera riga. E non gestisce gli overflow del buffer in modo sicuro.
Per i programmi reali, dovresti evitare “scanf” per l’immissione di testo. Utilizzare invece gets (che è deprecato e pericoloso) o, preferibilmente, fgets. Queste funzioni leggono una riga alla volta in un buffer. Una volta ottenuta la linea, puoi analizzarla. Puoi verificare la presenza di errori. Puoi verificare che l’input assomigli a un numero prima di provare a convertirlo. scanf salta questo passaggio. Si presuppone che tu sappia cosa stai facendo. Di solito no.
Rompere le cose di proposito
Il modo migliore per imparare il C non è leggere la documentazione. È rompendo il compilatore.
Prendi questo frammento:
Modificalo. Peggiorare le cose.
Elimina “b” dalla dichiarazione della variabile. Guarda il compilatore urlare per una variabile indefinita.
Elimina un punto e virgola. Guarda come si propaga l’errore di sintassi.
Rimuovere un tutore. Guarda il parser perdere la testa.
Elimina una parentesi. Osserva la confusione






































