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.