Come leggere l’input dell’utente in C con scanf

4

Le costanti sono convenienti. Sono statici. Ma sono anche noiosi.

Un programma che somma sempre 5 e 7 fa esattamente una cosa. Non si adatta. Non interagisce. Per rendere il codice C effettivamente utile per gli utenti finali, è necessario interrompere l’hardcoding dei valori e iniziare ad ascoltare.

Lo strumento per questo lavoro è “scanf”.

Da hardcoded a dinamico

Nell’esempio precedente, le variabili “a” e “b” erano probabilmente inizializzate con numeri fissi. La logica era rigida. Il risultato era prevedibile. Se volevi modificare l’aggiunta, dovevi modificare il codice sorgente, ricompilarlo ed eseguirlo di nuovo.

Non è facile da usare.

Per risolvere questo problema, dobbiamo acquisire l’input dalla console. La libreria standard gestisce sia l’output (printf ) che l’input (scanf ). Il passaggio dalle costanti ai valori definiti dall’utente trasforma il programma da una demo di calcolatrice in una semplice utility.

La sintassi scanf

Ecco il codice che lo rende possibile:

La logica è semplice. È lineare.

  1. Il programma richiede il primo numero intero.
  2. “scanf” attende l’input.
  3. L’utente digita un numero e preme invio.
  4. Il valore è memorizzato in “a”.
  5. Ripetere per “b”.
  6. Aggiungili.
  7. Stampa il risultato.

La confusione della e commerciale (&).

Il punto di errore più comune per i principianti qui è il simbolo “&”.

Guarda questa riga:
scanf("%d", &a);

Perché c’è una e commerciale? Perché non solo scanf("%d", a);?

Le variabili in C non sono solo nomi. Sono indirizzi di memoria. Quando dichiari “int a”, stai riservando una porzione di RAM. scanf non vuole il valore di a perché a è attualmente vuoto (o contiene spazzatura). scanf necessita dell’indirizzo dove scrivere il nuovo valore.

Il & è l’operatore “indirizzo di”. Fornisce a “scanf” la posizione in memoria in modo che possa modificare direttamente “a”. Senza di esso, stai puntando scanf su un pezzo di memoria casuale. Il programma probabilmente si bloccherà o, peggio, danneggerà i tuoi dati.

Intuizione chiave: printf utilizza il valore. scanf necessita dell’indirizzo.

Specificatori di formato

Hai utilizzato %d in printf per visualizzare un numero intero. Devi usare %d in scanf per leggerne uno.

La mancata corrispondenza di questi causa un comportamento indefinito. Se provi a leggere un numero intero utilizzando %f (float), i dati verranno interpretati in modo errato. Il layout della memoria di un float è diverso da un numero intero. scanf scriverà i bit grezzi di un float

Come scanf e printf gestiscono le variabili in C

Compilare ed eseguire il codice è il luogo in cui la teoria incontra la realtà. Se salti questo passaggio, stai solo indovinando. La funzione “scanf” funziona in modo simile a “printf” per quanto riguarda le stringhe di formato, ma ha requisiti più severi per l’input. È necessario inserire l’operatore indirizzo (& ) prima delle variabili di tipo “char”, “int”, “float” e strutture. Senza di esso, il programma si blocca.

Perché scanf richiede l’operatore indirizzo

La e commerciale non è facoltativa. Indica al compilatore di memorizzare l’input direttamente nella posizione di memoria della variabile. Se lo ometti, si attiva un errore di runtime. Dovresti provare a rimuoverlo intenzionalmente. Vedere l’incidente è più istruttivo che leggerlo. Mostra esattamente quanto fragile possa essere il C quando gli indirizzi di memoria non vengono gestiti correttamente.

Come printf formatta l’output per gli utenti

“printf” invia il testo allo standard output. La versione più semplice è simile a questa:

Questo stampa la parola “Ciao” senza fine riga. Confrontalo con:

Il \n aggiunge un ritorno a capo. Termina la linea. Senza di esso, l’output successivo apparirà sulla stessa riga. È un piccolo dettaglio che rovina la leggibilità se ignorato.

Come incorporare variabili nelle stringhe printf

Per restituire il valore di una variabile, si utilizza un segnaposto. L’operatore “%d” si sostituisce con il valore intero della variabile. Considera questo esempio:

Puoi concatenare chiamate printf separate per mescolare testo e variabili, ma è inefficiente:

L’approccio più pulito incorpora il segnaposto nella stringa:

Funzionano anche segnaposto multipli:

Il numero di segnaposto deve corrispondere esattamente al numero di variabili. Anche i tipi devono corrispondere. Tre specificatori “%d” richiedono tre parametri “int” nello stesso ordine. Tipi o conteggi non corrispondenti portano a un comportamento indefinito.

Quali segnaposto gestiscono diversi tipi C

printf supporta i tipi C standard tramite specificatori di formato specifici:

  • int utilizza %d
  • float utilizza %f
  • char utilizza %c
  • Le stringhe di caratteri utilizzano %s

Puoi trovare la documentazione dettagliata digitando “man 3 printf” su una macchina UNIX. Altri compilatori forniscono pagine di manuale o file di aiuto simili.

Errori comuni in C da evitare

La distinzione tra maiuscole e minuscole è rigorosa. Printf o PRINTF falliranno. Deve essere “printf” minuscolo.

  • Dimenticare & in scanf provoca arresti anomali del runtime.
  • Il conteggio dei parametri non corrispondenti in “printf” o “scanf” corrompe l’output.
  • L’utilizzo di variabili non dichiarate provoca errori di compilazione.

Il debug di questi problemi spesso si riduce prima al controllo della sintassi. Il compilatore di solito ti dirà esattamente dove si trova la mancata corrispondenza. Devi solo leggere il messaggio di errore.