2 00:00:00,000 --> 00:00:01,860 >> SPEAKER 1: Ni rigardu ĉe la CS50 biblioteko, 3 00:00:01,860 --> 00:00:05,190 specife lia GetInt funkcio. 4 00:00:05,190 --> 00:00:07,820 Ĉi tie ni havos la reala fonto kodo por GetInt. 5 00:00:07,820 --> 00:00:12,050 Kaj rimarki ke ĝi ne estas tro longa, kaj plejparto de ĝi konstituas dum buklo - 6 00:00:12,050 --> 00:00:15,620 malfinia ciklo ĉe tio - ke nur redonas valoron unufoje ni reale 7 00:00:15,620 --> 00:00:17,400 alveninta kion ni atendis. 8 00:00:17,400 --> 00:00:18,700 Ni iru tra ĝi. 9 00:00:18,700 --> 00:00:21,650 >> Rimarku tien unue, la dum buklo komencas. 10 00:00:21,650 --> 00:00:25,390 Rimarku sekvanta ke ni havas linion de kodo ke efektive nomas GetString, 11 00:00:25,390 --> 00:00:29,620 kaj stokas la reveno valoron en variablo, nomata linio, de tipo kordo. 12 00:00:29,620 --> 00:00:31,210 Ni do faru iom de prudento ĉekon. 13 00:00:31,210 --> 00:00:35,770 Se linio == null, tiam ni scivoleme revenu INT_MAX. 14 00:00:35,770 --> 00:00:40,140 >> Nun ĝi rezultas ke INT_MAX estas speciala konstanta deklaris aliloke 15 00:00:40,140 --> 00:00:44,030 kiu specifas la plej granda ebla int ke vi povas reprezenti en 16 00:00:44,030 --> 00:00:45,160 programo kiel ĉi tio. 17 00:00:45,160 --> 00:00:49,430 Nun ni jam arbitre decidis reveni INT_MAX kiel sentinelo valoro de 18 00:00:49,430 --> 00:00:53,120 varojn, kiu jam rezervis kiel signifanta eraro okazis. 19 00:00:53,120 --> 00:00:56,230 Do la prezo ni pagas, kompreneble, estas ke GetInt povas ŝajne ne 20 00:00:56,230 --> 00:01:01,440 reale resendas numeron tiel granda kiel INT_MAX, ĉar eĉ se ĝi volas, 21 00:01:01,440 --> 00:01:04,730 ke reveno valoro devus vere esti interpretitaj de la telefonanto - 22 00:01:04,730 --> 00:01:06,260 Kiu estas uzanta GetInt - 23 00:01:06,260 --> 00:01:09,340 kiel eraro de iu varo. 24 00:01:09,340 --> 00:01:13,840 >> Venonta, rimarki, ke Mi jam deklaris an int n kaj char c. 25 00:01:13,840 --> 00:01:18,030 En ĉi sekva linio de kodo, mi nomas funkcio nomita sscanf, pasante en 26 00:01:18,030 --> 00:01:18,970 kvar argumentojn. 27 00:01:18,970 --> 00:01:25,110 linio, kiu estas la kordoj de la uzanto tajpitaj en "% i% c", kio estas formato 28 00:01:25,110 --> 00:01:28,850 kordo, ke mi atendis la uzanto forteco tipo, sekvis per la adreso de 29 00:01:28,850 --> 00:01:30,920 n, kaj la adreso de c. 30 00:01:30,920 --> 00:01:34,860 Nun sscanf La celo en la vivo estas ja skani ĉenon serĉante la 31 00:01:34,860 --> 00:01:38,700 aparta formato kiun la programisto specifis kiel tiu dua argumento. 32 00:01:38,700 --> 00:01:42,020 En ĉi tiu kazo,% i estas en tie, kiel estas% c. 33 00:01:42,020 --> 00:01:46,700 Do se sscanf renkontas _int_ en la uzanto enigo, ke int estos stokitaj 34 00:01:46,700 --> 00:01:50,270 ene de la variablo nomata n, ĉar Ni provizis kiel la tria 35 00:01:50,270 --> 00:01:52,810 argumento por sscanf la adreso de n. 36 00:01:52,810 --> 00:01:56,870 Kiu signifas ke sscanf povas ja iri tie, kaj ĝisdatigi la valoron tie. 37 00:01:56,870 --> 00:01:59,990 >> Nun, en tiu kazo la uzanto tajpas en iu pli 38 00:01:59,990 --> 00:02:01,220 ol unu aŭ pli da ciferoj - 39 00:02:01,220 --> 00:02:03,570 en aliaj vortoj, char de iu speco - 40 00:02:03,570 --> 00:02:07,940 ke dua variablo c, kies adreso ni pasis en sscanf kiel ĝia kvara 41 00:02:07,940 --> 00:02:10,560 argumento ankaŭ estos popolita. 42 00:02:10,560 --> 00:02:14,220 Nun la supra parto de kontrolanta por aldona karaktero de la uzanto estas 43 00:02:14,220 --> 00:02:17,360 ke se li aŭ ŝi ne kunlaboras, kaj tipoj en pli ol nura int, 44 00:02:17,360 --> 00:02:20,530 ni povos detekti ĝin en tiu maniero, ĉar en tiu kazo, sscanf 45 00:02:20,530 --> 00:02:24,860 tuj revenos 2, montrante, ke ambaŭ de la anstataŭiloj satiĝis 46 00:02:24,860 --> 00:02:25,600 per valoroj. 47 00:02:25,600 --> 00:02:30,360 Sed ni esperis, ke sscanf anstataŭ Revenas 1, kio signifas ke la uzanto nur 48 00:02:30,360 --> 00:02:31,630 havigis int. 49 00:02:31,630 --> 00:02:34,480 >> Kion ni faru se sscanf ja revenas 1? 50 00:02:34,480 --> 00:02:39,150 Nu, ni tuj liberigi la linio kiu la uzanto tajpas en, kaj tiam ni 51 00:02:39,150 --> 00:02:42,670 tuj revenos n, havanta alveninta an int. 52 00:02:42,670 --> 00:02:47,180 Alie, se sscanf ne revenos 1, kaj la uzanto por tio ne kunlaboras, 53 00:02:47,180 --> 00:02:51,470 ni ankoraŭ liberigi la linion, sed ni nun instigas la uzanton reprovi. 54 00:02:51,470 --> 00:02:55,390 Kaj ĉar ni estas ankoraŭ ene de tiu alie senfina ciklo, la procezo 55 00:02:55,390 --> 00:03:00,190 komenciĝos denove, kaj eble pli, kaj eble pli, ĝis la uzanto reale 56 00:03:00,190 --> 00:03:01,500 havigas al ni int. 57 00:03:01,500 --> 00:03:21,490