>> ALTAVOZ 1: Vamos a echar un vistazo en la biblioteca CS50,
específicamente su función GetInt.
Aquí tenemos la fuente real código para GetInt.
Y note que no es demasiado largo, y mayor parte de ella constituye un bucle while -
un bucle infinito en el que - que sólo devuelve un valor, una vez que hemos hecho
conseguido lo que esperábamos.
Vamos a caminar a través de él.
>> Nótese aquí en primer lugar, la mientras que comienza bucle.
Observe próximo que tenemos una línea de código que en realidad llama GetString,
y almacena el valor de retorno en un variables, la línea llamada, de tipo string.
A continuación, hacer un poco de una prueba de cordura.
Si == línea nula, entonces curiosamente volver INT_MAX.
>> Ahora resulta que es un INT_MAX constante especial declarado en otro lugar
que especifica el mayor posible int que puede representar en un
programa como este.
Ahora hemos decidido arbitrariamente para volver INT_MAX como valor centinela de
clases, una que nos hemos reservado como lo que significa un error ha ocurrido.
Así que el precio que pagamos, por supuesto, es que GetInt aparentemente no puede
en realidad devolver un número tan grande como INT_MAX, porque incluso si se quiere,
que el valor de retorno debe realmente ser interpretada por la persona que llama -
quien está usando GetInt -
como un error de algún tipo.
>> A continuación, doy cuenta de que he declarado un int n y un char c.
En esta siguiente línea de código, que yo llamo un función llamada sscanf, pasando
cuatro argumentos.
línea, que es la cadena del usuario escrito en, "% i% c", que es un formato
cadena que estoy esperando el poderío de usuario tipo, seguido de la dirección de
n, y la dirección de c.
Ahora propósito de sscanf en la vida es de hecho para analizar una cadena en busca de la
formato particular que el programador ha especificado como el segundo argumento.
En este caso, i es en% allí, como es% c.
Así que si se encuentra con sscanf un int en el de entrada del usuario, se almacenará que int
interior de la variable llamada n, porque hemos proporcionado como la tercera
argumento para sscanf la dirección de n.
Lo que significa que de hecho puede ir sscanf allí, y actualizar el valor de la misma.
>> Ahora, en caso de que el usuario en algo más
de uno o más dígitos -
En otras palabras, un char de algún tipo -
esa segunda variable c, cuya dirección pasamos a sscanf como su cuarto
argumento también se llenará.
Ahora, el lado positivo de la comprobación de una carácter adicional del usuario es
que si él o ella no coopera, y los tipos en algo más que un int,
vamos a ser capaces de detectarlo en este manera, porque en ese caso, sscanf
va a volver 2, lo que significa que tanto de los marcadores de posición se llenaron
con valores.
Pero estamos esperando que sscanf lugar devuelve 1, lo que significa que sólo el usuario
proporcionado un int.
>> ¿Qué hacemos si sscanf de hecho devuelve 1?
Bueno, nos liberamos de inmediato la línea que el usuario escribió, y luego
volver inmediatamente n, teniendo conseguido un int.
Porque si sscanf no devuelve 1, y el usuario, por tanto, no cooperó,
todavía nos liberamos de la línea, pero ahora pedirá al usuario que vuelva a intentarlo.
Y debido a que aún estamos dentro de ese de lo contrario bucle infinito, el proceso
comenzará de nuevo, y tal vez de nuevo, y tal vez de nuevo, hasta que el usuario realmente
nos proporciona un int.