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.