2 00:00:00,000 --> 00:00:01,860 >> ALTAVEU 1: Anem a fer una ullada a la biblioteca CS50, 3 00:00:01,860 --> 00:00:05,190 específicament la seva funció GetInt. 4 00:00:05,190 --> 00:00:07,820 Aquí tenim la font real codi per GetInt. 5 00:00:07,820 --> 00:00:12,050 I noti que no és massa llarg, i major part constitueix un bucle while - 6 00:00:12,050 --> 00:00:15,620 un bucle infinit en el qual - que només retorna un valor, un cop hem fet 7 00:00:15,620 --> 00:00:17,400 aconseguit el que esperàvem. 8 00:00:17,400 --> 00:00:18,700 Anem a caminar a través d'ell. 9 00:00:18,700 --> 00:00:21,650 >> Noteu aquí en primer lloc, la mentre que comença bucle. 10 00:00:21,650 --> 00:00:25,390 Observi pròxim que tenim una línia de codi que en realitat diu GetString, 11 00:00:25,390 --> 00:00:29,620 i emmagatzema el valor de retorn en un variables, la línia anomenada, de tipus string. 12 00:00:29,620 --> 00:00:31,210 A continuació, fer una mica d'una prova de seny. 13 00:00:31,210 --> 00:00:35,770 Si == línia nul · la, llavors curiosament tornar INT_MAX. 14 00:00:35,770 --> 00:00:40,140 >> Ara resulta que és un INT_MAX constant especial declarat en un altre lloc 15 00:00:40,140 --> 00:00:44,030 que especifica el major possible int que pot representar en un 16 00:00:44,030 --> 00:00:45,160 programa com aquest. 17 00:00:45,160 --> 00:00:49,430 Ara hem decidit arbitràriament per tornar INT_MAX com a valor sentinella de 18 00:00:49,430 --> 00:00:53,120 classes, una que ens hem reservat com el que significa un error ha ocorregut. 19 00:00:53,120 --> 00:00:56,230 Així que el preu que paguem, per descomptat, és que GetInt aparentment no pot 20 00:00:56,230 --> 00:01:01,440 en realitat retornar un nombre tan gran com INT_MAX, perquè fins i tot si es vol, 21 00:01:01,440 --> 00:01:04,730 que el valor de retorn ha de realment ser interpretada per la persona que truca - 22 00:01:04,730 --> 00:01:06,260 qui està utilitzant GetInt - 23 00:01:06,260 --> 00:01:09,340 com un error d'algun tipus. 24 00:01:09,340 --> 00:01:13,840 >> A continuació, m'adono que he declarat 01:00 int n i un char c. 25 00:01:13,840 --> 00:01:18,030 En aquesta següent línia de codi, que jo anomeno un funció anomenada sscanf, passant 26 00:01:18,030 --> 00:01:18,970 quatre arguments. 27 00:01:18,970 --> 00:01:25,110 línia, que és la cadena de l'usuari escrit en, "% i% c", que és un format 28 00:01:25,110 --> 00:01:28,850 cadena que estic esperant el poder d'usuari tipus, seguit de l'adreça de 29 00:01:28,850 --> 00:01:30,920 n, i la direcció de c. 30 00:01:30,920 --> 00:01:34,860 Ara propòsit de sscanf a la vida és de fet per analitzar una cadena a la recerca de la 31 00:01:34,860 --> 00:01:38,700 format particular que el programador ha especificat com el segon argument. 32 00:01:38,700 --> 00:01:42,020 En aquest cas, i és en% allà, com és% c. 33 00:01:42,020 --> 00:01:46,700 Així que si es troba amb sscanf 1 int al d'entrada de l'usuari, s'emmagatzemarà que int 34 00:01:46,700 --> 00:01:50,270 interior de la variable anomenada n, perquè hem proporcionat com la tercera 35 00:01:50,270 --> 00:01:52,810 argument per sscanf la direcció de n. 36 00:01:52,810 --> 00:01:56,870 Això significa que de fet pot anar sscanf allà, i actualitzar el valor de la mateixa. 37 00:01:56,870 --> 00:01:59,990 >> Ara, en cas que l'usuari en alguna cosa més 38 00:01:59,990 --> 00:02:01,220 d'un o més dígits - 39 00:02:01,220 --> 00:02:03,570 En altres paraules, un char d'algun tipus - 40 00:02:03,570 --> 00:02:07,940 aquesta segona variable c, la direcció passem a sscanf com el seu quart 41 00:02:07,940 --> 00:02:10,560 argument també s'omplirà. 42 00:02:10,560 --> 00:02:14,220 Ara, el costat positiu de la comprovació d'una caràcter addicional de l'usuari és 43 00:02:14,220 --> 00:02:17,360 que si ell o ella no coopera, i els tipus en alguna cosa més que un int, 44 00:02:17,360 --> 00:02:20,530 serem capaços de detectar en aquest manera, perquè en aquest cas, sscanf 45 00:02:20,530 --> 00:02:24,860 tornarà 2, el que significa que tant dels marcadors de posició es van omplir 46 00:02:24,860 --> 00:02:25,600 amb valors. 47 00:02:25,600 --> 00:02:30,360 Però estem esperant que sscanf lloc retorna 1, el que significa que només l'usuari 48 00:02:30,360 --> 00:02:31,630 proporcionat un int. 49 00:02:31,630 --> 00:02:34,480 >> Què fem si sscanf de fet retorna 1? 50 00:02:34,480 --> 00:02:39,150 Bé, ens alliberem immediatament la línia que l'usuari va escriure, i després 51 00:02:39,150 --> 00:02:42,670 tornar immediatament n, tenint aconseguit un int. 52 00:02:42,670 --> 00:02:47,180 Perquè si sscanf no retorna 1, i l'usuari, per tant, no cooperar, 53 00:02:47,180 --> 00:02:51,470 encara ens alliberem de la línia, però ara demanarà a l'usuari que torni a intentar-ho. 54 00:02:51,470 --> 00:02:55,390 I pel fet que encara estem dins d'aquest en cas contrari bucle infinit, el procés 55 00:02:55,390 --> 00:03:00,190 començarà de nou, i potser de nou, i potser de nou, fins que l'usuari realment 56 00:03:00,190 --> 00:03:01,500 ens proporciona un int. 57 00:03:01,500 --> 00:03:21,490