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

10

Le costanti sono rigide. Non cambiano. La vita non è così, e nemmeno i tuoi programmi di test dovrebbero esserlo. Se stai imparando il C, i numeri hard-coding come 5 e 7 invecchiano velocemente. Vuoi interazione. Vuoi che il computer aspetti che tu digiti qualcosa.

Inserisci “scanf”.

È l’altra metà della storia di “printf”. Mentre “printf” invia i dati allo schermo, “scanf” li estrae dalla tastiera. Non è lo strumento più robusto nella libreria standard C, ma per il semplice input da console, svolge il lavoro senza bisogno di una dipendenza di terze parti.

Ecco come prendere uno script statico e renderlo dinamico.

Il codice

Copia questo. Eseguilo. Digita i numeri quando richiesto.

Scomposizione di scanf

La magia avviene in queste due righe:

scanf("%d", &a);

  • scanf : il nome della funzione. Abbreviazione di “scansione input formattato”.
  • "%d" : identificatore del formato. Dice a “scanf” di aspettarsi un numero intero. Se stavi leggendo un float, utilizzeresti "%f".
  • &a : questa è la parte critica. Non stai trasmettendo il valore di “a”. Stai trasmettendo l’indirizzo di “a”.

Pensatela in questo modo: printf deve sapere cosa c’è dentro la variabile. scanf deve sapere dove mettere i dati. L’operatore “&” fornisce quell’indirizzo di memoria. Salta la e commerciale e andrai in crash. O peggio, riceverai un avviso che sembra senza senso e una variabile che non cambia.

Come funziona nella pratica

Quando esegui il programma:

  1. Il terminale stampa: Inserisci il primo valore:
  2. Il cursore lampeggia. Aspetta. Rimani bloccato qui finché non digiti qualcosa e premi Invio.
  3. Digiti “5”. Premi Invio.
  4. scanf prende quel 5, converte la stringa di caratteri “5” nel valore intero 5 e lo memorizza nell’indirizzo di memoria &a.
  5. Lo stesso ciclo avviene per il secondo valore.

Poi arriva la matematica. c = a + b;. Aggiunta semplice.

Infine, “printf” mostra il risultato. Ma notate la stringa di formato: printf("%d + %d = %d\n", a, b, c);. Stai reimmettendo le variabili nella stringa. Questo è il modo in cui crei un output leggibile.

Perché è importante

La maggior parte delle applicazioni moderne non utilizza l’input della console. Non digiti comandi in una casella nera per il tuo browser web o il tuo editor di foto. Ma comprendere questo flusso è fondamentale.

Ingresso -> Processo -> Uscita.

Questo è il ciclo base di tutto il software. `

Come scanf gestisce gli indirizzi di memoria

Quando esegui questo codice, la differenza tra un successo e un arresto anomalo del runtime si riduce a un carattere. Nello specifico, la e commerciale (& ) prima delle variabili “a” e “b”.

Questo è l’operatore indirizzo. Dice a “scanf” esattamente dove archiviare in memoria l’input ricevuto. Senza di esso, scanf non conosce la posizione della variabile. Ottiene semplicemente un valore, che è inutile per memorizzare nuovamente i dati nel programma. Se lo ometti, il programma non verrà compilato o andrà in crash immediatamente dopo l’esecuzione. Questo operatore è necessario per i tipi “char”, “int”, “float” e struttura.

Prova a rimuoverlo. Guarda cosa succede. È una lezione dolorosa ma necessaria su come il C gestisce la memoria.

Padronanza dell’output printf

“printf” è la tua finestra per l’utente. Invia i dati all’output standard. La versione più semplice è immediata.

Questo stampa la parola Ciao. Nient’altro. Nessuna interruzione di riga. Il cursore rimane subito dopo la “o”.

Aggiungi un carattere di nuova riga.

Ora l’output passa alla riga successiva. Il \n è un ritorno a capo. È essenziale per un output della console leggibile.

Le variabili cambiano il gioco. Non puoi semplicemente stampare un nome di variabile come fai in Python o JavaScript. È necessario utilizzare un segnaposto.

Il %d è un segnaposto. Viene sostituito dal valore intero di “b” in fase di esecuzione. Questo è il modo in cui C gestisce l’output dinamico.

Puoi combinare testo e variabili. Un modo goffo è concatenare più stampe.

Funziona. È anche prolisso. L’approccio più pulito incorpora tutto in un’unica stringa.

Funzionano anche valori multipli. Mantieni semplicemente i segnaposto allineati con gli argomenti.

L’ordine conta. Il primo %d corrisponde a a. Il secondo in “b”. La terza in “c”. Se li scambi, i conti sono sbagliati. Se ne perdi uno, il comportamento non è definito. Il numero e il tipo di operatori nella stringa di formato devono corrispondere esattamente ai parametri.

Segnaposto specifici del tipo

C è rigoroso riguardo ai tipi. Non è possibile utilizzare lo stesso segnaposto per tutto. È necessario far corrispondere il tipo di dati all’identificatore di formato.

  • Utilizzare %d per int (valori interi).
  • Utilizzare %f per float (numeri in virgola mobile).
  • Utilizzare %c per char (caratteri singoli).
  • Utilizzare %s per stringhe di caratteri (array di caratteri).

Se usi %d per un float, ottieni un output spazzatura. Se usi %s per un int, probabilmente il programma si blocca. La precisione qui non è un optional.

Per dettagli più approfonditi su questi specificatori, consultare il manuale UNIX. Digita “man 3 printf”. Altri compilatori forniscono documentazione simile. Vale la pena leggerlo.

Insidie ​​comuni da evitare

I compilatori C sono utili, ma non leggono la mente. Farai degli errori. Ecco come evitare quelli più comuni.

  1. Distinzione tra maiuscole e minuscole : C fa distinzione tra maiuscole e minuscole. Printf o PRINTF falliranno. Deve essere “printf”. Lo stesso vale per i nomi delle variabili e le chiamate di funzioni.
  2. Operatore indirizzo mancante : dimenticare & in scanf è un errore frequente. Causa un errore immediato di runtime. Includilo sempre per i tipi primitivi.
  3. Parametri non corrispondenti : Troppi o troppo pochi argomenti in printf o scanf portano a errori. La stringa di formato determina la struttura. Attieniti ad esso.
  4. Variabili non dichiarate : è necessario dichiarare una variabile prima di utilizzarla. C non deduce i tipi. Definisci int a; prima di poter stampare a.

Questi errori sono ripetitivi. Sono anche facili da risolvere una volta riconosciuto il modello.