>> SPEAKER 1: Diamo uno sguardo presso la biblioteca CS50,
in particolare la sua funzione GetInt.
Qui abbiamo la fonte reale codice per GetInt.
E notare che non Ă¨ troppo lungo, e la maggior parte di esso costituisce un ciclo while -
un ciclo infinito in quel - che solo restituisce un valore una volta che abbiamo effettivamente
ottenuto quello che ci aspettavamo.
Camminiamo attraverso di essa.
>> Si noti qui in primo luogo, l' ciclo while inizia.
Si noti poi che abbiamo una riga di codice che in realtĂ chiama GetString,
e memorizza il valore restituito in un variabile, detta la linea, di tipo stringa.
Abbiamo poi facciamo un po 'di un controllo di integritĂ .
Se la linea == null, allora curiosamente ritorno INT_MAX.
>> Ora si scopre che INT_MAX Ă¨ un costante speciale dichiarato altrove
che specifica il piĂš grande possibile int che Ă¨ possibile rappresentare in un
programma come questo.
Ora abbiamo arbitrariamente deciso di tornare INT_MAX come valore sentinella di
tipi, uno che abbiamo riservato come il che significa un errore si Ă¨ verificato.
Quindi il prezzo che paghiamo, ovviamente, Ă¨ GetInt che a quanto pare non Ă¨ possibile
in realtĂ restituire un numero grande come INT_MAX, perchĂŠ anche se vuole,
che il valore di ritorno dovrebbe davvero essere interpretato dal chiamante -
chi sta usando GetInt -
come un errore di qualche tipo.
>> Poi, noto che ho dichiarato un int n ed un char c.
In questa riga di codice, che io chiamo un funzione chiamata sscanf, passando
quattro argomenti.
linea, che Ă¨ la stringa dell'utente digitato, "% i% c", che Ă¨ un formato
stringa che mi aspetto la forza utente tipo, seguito dal recapito
n, e l'indirizzo della c.
Ora lo scopo di sscanf nella vita Ă¨ davvero per la scansione di una stringa di ricerca del
formato particolare che il programmatore ha specificato come quella secondo argomento.
In questo caso, i Ă¨ in% ci, come Ă¨% c.
Quindi, se sscanf incontra un int in di input dell'utente, sarĂ memorizzato che int
all'interno della variabile denominata n, perchĂŠ abbiamo fornito come terzo
argomento sscanf l'indirizzo del n.
Il che significa che sscanf puĂ˛ infatti andare lĂŹ, e aggiornare il valore in esso.
>> Ora, nel caso in cui l'utente in qualcosa di piĂš
di una o piĂš cifre -
in altre parole, un carattere di qualche tipo -
che secondo c variabile, il cui indirizzo siamo passati in sscanf come il suo quarto
l'argomento sarĂ anche popolato.
Ora il rialzo di controllo per un carattere aggiuntivo da parte dell'utente Ă¨
che se lui o lei non collabora, e tipi in piĂš di un int,
saremo in grado di rilevare in questa modo, perchĂŠ in tal caso, sscanf
sta per tornare 2, a significare che entrambi i segnaposto sono stati riempiti
con valori.
Ma speriamo che sscanf invece restituisce 1, il che significa che solo l'utente
fornito un int.
>> Cosa facciamo se sscanf anzi restituisce 1?
Beh, ci liberiamo subito la linea che l'utente ha digitato, e poi ci
immediatamente ritorno n, avendo ottenuto un int.
Altrimenti, se sscanf non restituisce 1, e l'utente quindi non ha collaborato,
abbiamo ancora liberare la linea, ma noi ora chiederĂ all'utente di riprovare.
E perchĂŠ siamo ancora dentro di quella ciclo altrimenti infinito, il processo
inizierĂ di nuovo, e forse ancora una volta, e forse ancora, finchĂŠ l'utente effettivamente
ci fornisce un int.