2 00:00:00,000 --> 00:00:01,860 >> COLUMNA 1: Imos dar un ollo na biblioteca CS50, 3 00:00:01,860 --> 00:00:05,190 especialmente a súa función GetInt. 4 00:00:05,190 --> 00:00:07,820 Aquí temos a verdadeira fonte código para GetInt. 5 00:00:07,820 --> 00:00:12,050 E teña en conta que non é moito tempo, e a maior parte dela constitúe un loop while - 6 00:00:12,050 --> 00:00:15,620 un loop infinito en que - de que só retorna un valor, xa que o que realmente 7 00:00:15,620 --> 00:00:17,400 obtido o que esperabamos. 8 00:00:17,400 --> 00:00:18,700 Imos atravesalo-la. 9 00:00:18,700 --> 00:00:21,650 >> Observe-se aquí por primeira vez, o while comeza. 10 00:00:21,650 --> 00:00:25,390 Observe próxima que temos unha liña de código que realmente chama GetString, 11 00:00:25,390 --> 00:00:29,620 e almacena o valor de retorno dunha variable, liña chamada, do tipo cadea. 12 00:00:29,620 --> 00:00:31,210 A continuación, facer un pouco de unha proba de sanidade. 13 00:00:31,210 --> 00:00:35,770 Se a liña == null, entón nós curiosamente volver INT_MAX. 14 00:00:35,770 --> 00:00:40,140 >> Agora verifícase que é un INT_MAX constante especial declarado noutro lugar 15 00:00:40,140 --> 00:00:44,030 que especifica o maior posible int que pode representar nun 16 00:00:44,030 --> 00:00:45,160 programa como este. 17 00:00:45,160 --> 00:00:49,430 Agora nós arbitrariamente decidiu volver INT_MAX como un valor de sentinela de 18 00:00:49,430 --> 00:00:53,120 tipo, o que temos reservado como o que significa que se produciu un erro. 19 00:00:53,120 --> 00:00:56,230 Así, o prezo que pagamos, por suposto, é GetInt que, ao parecer, non pode 20 00:00:56,230 --> 00:01:01,440 realmente voltar un número tan grande como INT_MAX, porque aínda que el quere, 21 00:01:01,440 --> 00:01:04,730 que o valor de retorno que realmente ser interpretado polo interlocutor - 22 00:01:04,730 --> 00:01:06,260 quen está a usar GetInt - 23 00:01:06,260 --> 00:01:09,340 como un erro de calquera tipo. 24 00:01:09,340 --> 00:01:13,840 >> Logo entender que eu xa declarou un int n e un char c. 25 00:01:13,840 --> 00:01:18,030 Nesta próxima liña de código, que eu chamo de función chamada sscanf, pasando 26 00:01:18,030 --> 00:01:18,970 catro argumentos. 27 00:01:18,970 --> 00:01:25,110 liña, que é a secuencia do usuario tecleada, "% i% c", que é un formato 28 00:01:25,110 --> 00:01:28,850 cadea que estou esperando o poder do usuario tipo, seguíndose o enderezo de 29 00:01:28,850 --> 00:01:30,920 n, e o enderezo de c. 30 00:01:30,920 --> 00:01:34,860 Agora propósito do sscanf na vida é de feito para varrer unha cadea a buscar o 31 00:01:34,860 --> 00:01:38,700 formato específico que o programador especificou como o segundo argumento. 32 00:01:38,700 --> 00:01:42,020 Neste caso, é en% i alí, como é% c. 33 00:01:42,020 --> 00:01:46,700 Entón, se sscanf atopa un int no de entrada do usuario, que int pode ser almacenada 34 00:01:46,700 --> 00:01:50,270 dentro da variable chamada n porque que proporcionaron o terceiro 35 00:01:50,270 --> 00:01:52,810 argumento de sscanf o enderezo do n. 36 00:01:52,810 --> 00:01:56,870 O que significa que sscanf realmente pode ir alí, e actualizar o valor nel. 37 00:01:56,870 --> 00:01:59,990 >> Agora, se o usuario escribe en algo máis 38 00:01:59,990 --> 00:02:01,220 dun ou máis díxitos - 39 00:02:01,220 --> 00:02:03,570 noutras palabras, un carácter dunha especie - 40 00:02:03,570 --> 00:02:07,940 que segundo c variable, cuxo enderezo pasamos en sscanf como a súa cuarta 41 00:02:07,940 --> 00:02:10,560 argumento tamén se enche. 42 00:02:10,560 --> 00:02:14,220 Agora, a cabeza de verificación dun carácter adicional do usuario é 43 00:02:14,220 --> 00:02:17,360 que, se el ou ela non cooperar, e tipo en máis que un int, 44 00:02:17,360 --> 00:02:20,530 nós imos ser capaces de detecta-lo neste maneira, porque, nese caso, sscanf 45 00:02:20,530 --> 00:02:24,860 Vai voltar 2, significando que ambos espazos reservados foron cubertas 46 00:02:24,860 --> 00:02:25,600 con valores. 47 00:02:25,600 --> 00:02:30,360 Pero estamos esperando que sscanf vez regresa 1, o que significa que só o usuario 48 00:02:30,360 --> 00:02:31,630 solicitado un int. 49 00:02:31,630 --> 00:02:34,480 >> O que imos facer se sscanf en realidade, volve 1? 50 00:02:34,480 --> 00:02:39,150 Ben, nós inmediatamente liberar a liña que o usuario inseriu, e entón nós 51 00:02:39,150 --> 00:02:42,670 voltar inmediatamente n, tendo obtido un int. 52 00:02:42,670 --> 00:02:47,180 Outra cousa, se sscanf non retornar 1, e o usuario, polo tanto, non cooperar, 53 00:02:47,180 --> 00:02:51,470 aínda liberar a liña, pero nós agora solicitar ao usuario que tente de novo. 54 00:02:51,470 --> 00:02:55,390 E por que aínda estamos dentro dese repetición infinita, o proceso de 55 00:02:55,390 --> 00:03:00,190 vai comezar de novo, e quizais de novo, e quizais unha vez máis, ata que o usuario realmente 56 00:03:00,190 --> 00:03:01,500 ofrece-nos un int. 57 00:03:01,500 --> 00:03:21,490