2 00:00:00,000 --> 00:00:01,860 >> ALTAVOZ 1: Vamos a echar un vistazo en la biblioteca CS50, 3 00:00:01,860 --> 00:00:05,190 específicamente su función GetInt. 4 00:00:05,190 --> 00:00:07,820 Aquí tenemos la fuente real código para GetInt. 5 00:00:07,820 --> 00:00:12,050 Y note que no es demasiado largo, y mayor parte de ella constituye un bucle while - 6 00:00:12,050 --> 00:00:15,620 un bucle infinito en el que - que sólo devuelve un valor, una vez que hemos hecho 7 00:00:15,620 --> 00:00:17,400 conseguido lo que esperábamos. 8 00:00:17,400 --> 00:00:18,700 Vamos a caminar a través de él. 9 00:00:18,700 --> 00:00:21,650 >> Nótese aquí en primer lugar, la mientras que comienza bucle. 10 00:00:21,650 --> 00:00:25,390 Observe próximo que tenemos una línea de código que en realidad llama GetString, 11 00:00:25,390 --> 00:00:29,620 y almacena el valor de retorno en un variables, la línea llamada, de tipo string. 12 00:00:29,620 --> 00:00:31,210 A continuación, hacer un poco de una prueba de cordura. 13 00:00:31,210 --> 00:00:35,770 Si == línea nula, entonces curiosamente volver INT_MAX. 14 00:00:35,770 --> 00:00:40,140 >> Ahora resulta que es un INT_MAX constante especial declarado en otro lugar 15 00:00:40,140 --> 00:00:44,030 que especifica el mayor posible int que puede representar en un 16 00:00:44,030 --> 00:00:45,160 programa como este. 17 00:00:45,160 --> 00:00:49,430 Ahora hemos decidido arbitrariamente para volver INT_MAX como valor centinela de 18 00:00:49,430 --> 00:00:53,120 clases, una que nos hemos reservado como lo que significa un error ha ocurrido. 19 00:00:53,120 --> 00:00:56,230 Así que el precio que pagamos, por supuesto, es que GetInt aparentemente no puede 20 00:00:56,230 --> 00:01:01,440 en realidad devolver un número tan grande como INT_MAX, porque incluso si se quiere, 21 00:01:01,440 --> 00:01:04,730 que el valor de retorno debe realmente ser interpretada por la persona que llama - 22 00:01:04,730 --> 00:01:06,260 quien está usando GetInt - 23 00:01:06,260 --> 00:01:09,340 como un error de algún tipo. 24 00:01:09,340 --> 00:01:13,840 >> A continuación, doy cuenta de que he declarado un int n y un char c. 25 00:01:13,840 --> 00:01:18,030 En esta siguiente línea de código, que yo llamo un función llamada sscanf, pasando 26 00:01:18,030 --> 00:01:18,970 cuatro argumentos. 27 00:01:18,970 --> 00:01:25,110 línea, que es la cadena del usuario escrito en, "% i% c", que es un formato 28 00:01:25,110 --> 00:01:28,850 cadena que estoy esperando el poderío de usuario tipo, seguido de la dirección de 29 00:01:28,850 --> 00:01:30,920 n, y la dirección de c. 30 00:01:30,920 --> 00:01:34,860 Ahora propósito de sscanf en la vida es de hecho para analizar una cadena en busca de la 31 00:01:34,860 --> 00:01:38,700 formato particular que el programador ha especificado como el segundo argumento. 32 00:01:38,700 --> 00:01:42,020 En este caso, i es en% allí, como es% c. 33 00:01:42,020 --> 00:01:46,700 Así que si se encuentra con sscanf un int en el de entrada del usuario, se almacenará que int 34 00:01:46,700 --> 00:01:50,270 interior de la variable llamada n, porque hemos proporcionado como la tercera 35 00:01:50,270 --> 00:01:52,810 argumento para sscanf la dirección de n. 36 00:01:52,810 --> 00:01:56,870 Lo que significa que de hecho puede ir sscanf allí, y actualizar el valor de la misma. 37 00:01:56,870 --> 00:01:59,990 >> Ahora, en caso de que el usuario en algo más 38 00:01:59,990 --> 00:02:01,220 de uno o más dígitos - 39 00:02:01,220 --> 00:02:03,570 En otras palabras, un char de algún tipo - 40 00:02:03,570 --> 00:02:07,940 esa segunda variable c, cuya dirección pasamos a sscanf como su cuarto 41 00:02:07,940 --> 00:02:10,560 argumento también se llenará. 42 00:02:10,560 --> 00:02:14,220 Ahora, el lado positivo de la comprobación de una carácter adicional del usuario es 43 00:02:14,220 --> 00:02:17,360 que si él o ella no coopera, y los tipos en algo más que un int, 44 00:02:17,360 --> 00:02:20,530 vamos a ser capaces de detectarlo en este manera, porque en ese caso, sscanf 45 00:02:20,530 --> 00:02:24,860 va a volver 2, lo que significa que tanto de los marcadores de posición se llenaron 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 lugar devuelve 1, lo que significa que sólo el usuario 48 00:02:30,360 --> 00:02:31,630 proporcionado un int. 49 00:02:31,630 --> 00:02:34,480 >> ¿Qué hacemos si sscanf de hecho devuelve 1? 50 00:02:34,480 --> 00:02:39,150 Bueno, nos liberamos de inmediato la línea que el usuario escribió, y luego 51 00:02:39,150 --> 00:02:42,670 volver inmediatamente n, teniendo conseguido un int. 52 00:02:42,670 --> 00:02:47,180 Porque si sscanf no devuelve 1, y el usuario, por tanto, no cooperó, 53 00:02:47,180 --> 00:02:51,470 todavía nos liberamos de la línea, pero ahora pedirá al usuario que vuelva a intentarlo. 54 00:02:51,470 --> 00:02:55,390 Y debido a que aún estamos dentro de ese de lo contrario bucle infinito, el proceso 55 00:02:55,390 --> 00:03:00,190 comenzará de nuevo, y tal vez de nuevo, y tal vez de nuevo, hasta que el usuario realmente 56 00:03:00,190 --> 00:03:01,500 nos proporciona un int. 57 00:03:01,500 --> 00:03:21,490