>> COLUMNA 1: Imos dar un ollo na biblioteca CS50,
especialmente a súa función GetInt.
Aquí temos a verdadeira fonte código para GetInt.
E teña en conta que non é moito tempo, e a maior parte dela constitúe un loop while -
un loop infinito en que - de que só retorna un valor, xa que o que realmente
obtido o que esperabamos.
Imos atravesalo-la.
>> Observe-se aquí por primeira vez, o while comeza.
Observe próxima que temos unha liña de código que realmente chama GetString,
e almacena o valor de retorno dunha variable, liña chamada, do tipo cadea.
A continuación, facer un pouco de unha proba de sanidade.
Se a liña == null, entón nós curiosamente volver INT_MAX.
>> Agora verifícase que é un INT_MAX constante especial declarado noutro lugar
que especifica o maior posible int que pode representar nun
programa como este.
Agora nós arbitrariamente decidiu volver INT_MAX como un valor de sentinela de
tipo, o que temos reservado como o que significa que se produciu un erro.
Así, o prezo que pagamos, por suposto, é GetInt que, ao parecer, non pode
realmente voltar un número tan grande como INT_MAX, porque aínda que el quere,
que o valor de retorno que realmente ser interpretado polo interlocutor -
quen está a usar GetInt -
como un erro de calquera tipo.
>> Logo entender que eu xa declarou un int n e un char c.
Nesta próxima liña de código, que eu chamo de función chamada sscanf, pasando
catro argumentos.
liña, que é a secuencia do usuario tecleada, "% i% c", que é un formato
cadea que estou esperando o poder do usuario tipo, seguíndose o enderezo de
n, e o enderezo de c.
Agora propósito do sscanf na vida é de feito para varrer unha cadea a buscar o
formato específico que o programador especificou como o segundo argumento.
Neste caso, é en% i alí, como é% c.
Entón, se sscanf atopa un int no de entrada do usuario, que int pode ser almacenada
dentro da variable chamada n porque que proporcionaron o terceiro
argumento de sscanf o enderezo do n.
O que significa que sscanf realmente pode ir alí, e actualizar o valor nel.
>> Agora, se o usuario escribe en algo máis
dun ou máis díxitos -
noutras palabras, un carácter dunha especie -
que segundo c variable, cuxo enderezo pasamos en sscanf como a súa cuarta
argumento tamén se enche.
Agora, a cabeza de verificación dun carácter adicional do usuario é
que, se el ou ela non cooperar, e tipo en máis que un int,
nós imos ser capaces de detecta-lo neste maneira, porque, nese caso, sscanf
Vai voltar 2, significando que ambos espazos reservados foron cubertas
con valores.
Pero estamos esperando que sscanf vez regresa 1, o que significa que só o usuario
solicitado un int.
>> O que imos facer se sscanf en realidade, volve 1?
Ben, nós inmediatamente liberar a liña que o usuario inseriu, e entón nós
voltar inmediatamente n, tendo obtido un int.
Outra cousa, se sscanf non retornar 1, e o usuario, polo tanto, non cooperar,
aínda liberar a liña, pero nós agora solicitar ao usuario que tente de novo.
E por que aínda estamos dentro dese repetición infinita, o proceso de
vai comezar de novo, e quizais de novo, e quizais unha vez máis, ata que o usuario realmente
ofrece-nos un int.