2 00:00:00,000 --> 00:00:01,860 >> SPEAKER 1: Diamo uno sguardo presso la biblioteca CS50, 3 00:00:01,860 --> 00:00:05,190 in particolare la sua funzione GetInt. 4 00:00:05,190 --> 00:00:07,820 Qui abbiamo la fonte reale codice per GetInt. 5 00:00:07,820 --> 00:00:12,050 E notare che non è troppo lungo, e la maggior parte di esso costituisce un ciclo while - 6 00:00:12,050 --> 00:00:15,620 un ciclo infinito in quel - che solo restituisce un valore una volta che abbiamo effettivamente 7 00:00:15,620 --> 00:00:17,400 ottenuto quello che ci aspettavamo. 8 00:00:17,400 --> 00:00:18,700 Camminiamo attraverso di essa. 9 00:00:18,700 --> 00:00:21,650 >> Si noti qui in primo luogo, l' ciclo while inizia. 10 00:00:21,650 --> 00:00:25,390 Si noti poi che abbiamo una riga di codice che in realtà chiama GetString, 11 00:00:25,390 --> 00:00:29,620 e memorizza il valore restituito in un variabile, detta la linea, di tipo stringa. 12 00:00:29,620 --> 00:00:31,210 Abbiamo poi facciamo un po 'di un controllo di integrità. 13 00:00:31,210 --> 00:00:35,770 Se la linea == null, allora curiosamente ritorno INT_MAX. 14 00:00:35,770 --> 00:00:40,140 >> Ora si scopre che INT_MAX è un costante speciale dichiarato altrove 15 00:00:40,140 --> 00:00:44,030 che specifica il piÚ grande possibile int che è possibile rappresentare in un 16 00:00:44,030 --> 00:00:45,160 programma come questo. 17 00:00:45,160 --> 00:00:49,430 Ora abbiamo arbitrariamente deciso di tornare INT_MAX come valore sentinella di 18 00:00:49,430 --> 00:00:53,120 tipi, uno che abbiamo riservato come il che significa un errore si è verificato. 19 00:00:53,120 --> 00:00:56,230 Quindi il prezzo che paghiamo, ovviamente, è GetInt che a quanto pare non è possibile 20 00:00:56,230 --> 00:01:01,440 in realtà restituire un numero grande come INT_MAX, perchÊ anche se vuole, 21 00:01:01,440 --> 00:01:04,730 che il valore di ritorno dovrebbe davvero essere interpretato dal chiamante - 22 00:01:04,730 --> 00:01:06,260 chi sta usando GetInt - 23 00:01:06,260 --> 00:01:09,340 come un errore di qualche tipo. 24 00:01:09,340 --> 00:01:13,840 >> Poi, noto che ho dichiarato un int n ed un char c. 25 00:01:13,840 --> 00:01:18,030 In questa riga di codice, che io chiamo un funzione chiamata sscanf, passando 26 00:01:18,030 --> 00:01:18,970 quattro argomenti. 27 00:01:18,970 --> 00:01:25,110 linea, che è la stringa dell'utente digitato, "% i% c", che è un formato 28 00:01:25,110 --> 00:01:28,850 stringa che mi aspetto la forza utente tipo, seguito dal recapito 29 00:01:28,850 --> 00:01:30,920 n, e l'indirizzo della c. 30 00:01:30,920 --> 00:01:34,860 Ora lo scopo di sscanf nella vita è davvero per la scansione di una stringa di ricerca del 31 00:01:34,860 --> 00:01:38,700 formato particolare che il programmatore ha specificato come quella secondo argomento. 32 00:01:38,700 --> 00:01:42,020 In questo caso, i è in% ci, come è% c. 33 00:01:42,020 --> 00:01:46,700 Quindi, se sscanf incontra un int in di input dell'utente, sarà memorizzato che int 34 00:01:46,700 --> 00:01:50,270 all'interno della variabile denominata n, perchÊ abbiamo fornito come terzo 35 00:01:50,270 --> 00:01:52,810 argomento sscanf l'indirizzo del n. 36 00:01:52,810 --> 00:01:56,870 Il che significa che sscanf può infatti andare lÏ, e aggiornare il valore in esso. 37 00:01:56,870 --> 00:01:59,990 >> Ora, nel caso in cui l'utente in qualcosa di piÚ 38 00:01:59,990 --> 00:02:01,220 di una o piÚ cifre - 39 00:02:01,220 --> 00:02:03,570 in altre parole, un carattere di qualche tipo - 40 00:02:03,570 --> 00:02:07,940 che secondo c variabile, il cui indirizzo siamo passati in sscanf come il suo quarto 41 00:02:07,940 --> 00:02:10,560 l'argomento sarà anche popolato. 42 00:02:10,560 --> 00:02:14,220 Ora il rialzo di controllo per un carattere aggiuntivo da parte dell'utente è 43 00:02:14,220 --> 00:02:17,360 che se lui o lei non collabora, e tipi in piÚ di un int, 44 00:02:17,360 --> 00:02:20,530 saremo in grado di rilevare in questa modo, perchÊ in tal caso, sscanf 45 00:02:20,530 --> 00:02:24,860 sta per tornare 2, a significare che entrambi i segnaposto sono stati riempiti 46 00:02:24,860 --> 00:02:25,600 con valori. 47 00:02:25,600 --> 00:02:30,360 Ma speriamo che sscanf invece restituisce 1, il che significa che solo l'utente 48 00:02:30,360 --> 00:02:31,630 fornito un int. 49 00:02:31,630 --> 00:02:34,480 >> Cosa facciamo se sscanf anzi restituisce 1? 50 00:02:34,480 --> 00:02:39,150 Beh, ci liberiamo subito la linea che l'utente ha digitato, e poi ci 51 00:02:39,150 --> 00:02:42,670 immediatamente ritorno n, avendo ottenuto un int. 52 00:02:42,670 --> 00:02:47,180 Altrimenti, se sscanf non restituisce 1, e l'utente quindi non ha collaborato, 53 00:02:47,180 --> 00:02:51,470 abbiamo ancora liberare la linea, ma noi ora chiederà all'utente di riprovare. 54 00:02:51,470 --> 00:02:55,390 E perchÊ siamo ancora dentro di quella ciclo altrimenti infinito, il processo 55 00:02:55,390 --> 00:03:00,190 inizierà di nuovo, e forse ancora una volta, e forse ancora, finchÊ l'utente effettivamente 56 00:03:00,190 --> 00:03:01,500 ci fornisce un int. 57 00:03:01,500 --> 00:03:21,490