2 00:00:00,000 --> 00:00:01,860 >> SPEAKER 1: Pojďme se podívat v knihovně CS50, 3 00:00:01,860 --> 00:00:05,190 konkrétně jeho vezmi_int funkce. 4 00:00:05,190 --> 00:00:07,820 Zde máme skutečný zdroj Kód pro vezmi_int. 5 00:00:07,820 --> 00:00:12,050 A všimněte si, že to není příliš dlouhá, a většina z nich představuje while - 6 00:00:12,050 --> 00:00:15,620 nekonečné smyčky na to - že pouze vrátí hodnotu, jakmile máme vlastně 7 00:00:15,620 --> 00:00:17,400 dostal to, co jsme očekávali. 8 00:00:17,400 --> 00:00:18,700 Pojďme si projít to. 9 00:00:18,700 --> 00:00:21,650 >> Všimněte si, až tu první, zatímco začíná smyčka. 10 00:00:21,650 --> 00:00:25,390 Všimněte si, že máme následující řádek kódu že vlastně volá GetString, 11 00:00:25,390 --> 00:00:29,620 a ukládá návratovou hodnotu v variabilní, volaná linka, typu řetězec. 12 00:00:29,620 --> 00:00:31,210 Pak jsme to trochu kontroly zdravý rozum. 13 00:00:31,210 --> 00:00:35,770 Pokud je linka == null, pak se zvědavě návrat INT_MAX. 14 00:00:35,770 --> 00:00:40,140 >> Nyní se ukazuje, že INT_MAX je speciální konstanta deklarována jinde 15 00:00:40,140 --> 00:00:44,030 , který určuje největší možný pravý, který může představovat v 16 00:00:44,030 --> 00:00:45,160 program, jako je tento. 17 00:00:45,160 --> 00:00:49,430 Teď jsme svévolně rozhodli k návratu INT_MAX Sentinel hodnotu 18 00:00:49,430 --> 00:00:53,120 druhy, ten, který jsme rezervovaný jako což znamená, došlo k chybě. 19 00:00:53,120 --> 00:00:56,230 Takže cena, kterou platíme, je samozřejmě že vezmi_int může zřejmě není 20 00:00:56,230 --> 00:01:01,440 vlastně vrací číslo tak velké, jako INT_MAX, protože i když se chce, 21 00:01:01,440 --> 00:01:04,730 že návratová hodnota by měla ve skutečnosti být interpretován volajícího - 22 00:01:04,730 --> 00:01:06,260 kdo je používá vezmi_int - 23 00:01:06,260 --> 00:01:09,340 jako chybu nějakého druhu. 24 00:01:09,340 --> 00:01:13,840 >> Dále si všimněte, že jsem prohlásil, int n a char c. 25 00:01:13,840 --> 00:01:18,030 V tomto dalším řádku kódu, říkám funkce tzv. sscanf, předáním 26 00:01:18,030 --> 00:01:18,970 čtyři argumenty. 27 00:01:18,970 --> 00:01:25,110 linka, což je řetězec uživatele zadal, "% i% c", což je formát 28 00:01:25,110 --> 00:01:28,850 Řetězec, který jsem očekával, může uživatel typ, následovaný adresou 29 00:01:28,850 --> 00:01:30,920 n, a adresa c. 30 00:01:30,920 --> 00:01:34,860 Nyní sscanf je smyslem života je skutečně skenování řetězec hledá 31 00:01:34,860 --> 00:01:38,700 zejména ve formátu, který programátor je uvedeno jako ten druhý argument. 32 00:01:38,700 --> 00:01:42,020 V tomto případě, i% je v tam, jak je% c. 33 00:01:42,020 --> 00:01:46,700 Takže pokud sscanf narazí na int vstup uživatele, bude, že int je uložen 34 00:01:46,700 --> 00:01:50,270 v proměnné s názvem n, protože jsme poskytli jako třetí 35 00:01:50,270 --> 00:01:52,810 argument sscanf adresu n.. 36 00:01:52,810 --> 00:01:56,870 Což znamená, že sscanf skutečně může jít tam, a aktualizujte hodnotu v něm. 37 00:01:56,870 --> 00:01:59,990 >> Nyní, v případě, že uživatel zadá v něco víc 38 00:01:59,990 --> 00:02:01,220 než jedné nebo více číslic - 39 00:02:01,220 --> 00:02:03,570 jinými slovy, char nějakého druhu - 40 00:02:03,570 --> 00:02:07,940 že druhá proměnná c, jehož adresa jsme prošli do sscanf jako čtvrtý 41 00:02:07,940 --> 00:02:10,560 Argument se také naplněna. 42 00:02:10,560 --> 00:02:14,220 Nyní vzhůru kontroly pro další postava z uživatele je 43 00:02:14,220 --> 00:02:17,360 že pokud on nebo ona nespolupracuje, a druhy ve více než jen int, 44 00:02:17,360 --> 00:02:20,530 budeme moci zjistit, že v tomto způsobem, protože v tomto případě, sscanf 45 00:02:20,530 --> 00:02:24,860 se chystá vrátit 2, znamenat, že oba zástupné symboly byly vyplněny 46 00:02:24,860 --> 00:02:25,600 s hodnotami. 47 00:02:25,600 --> 00:02:30,360 Ale my místo toho doufá, že sscanf vrátí 1, což znamená, že pouze uživatel 48 00:02:30,360 --> 00:02:31,630 za předpokladu, int. 49 00:02:31,630 --> 00:02:34,480 >> Co budeme dělat, když sscanf opravdu vrací 1? 50 00:02:34,480 --> 00:02:39,150 No, jsme okamžitě uvolnit linku, která uživatel zadal, a pak jsme 51 00:02:39,150 --> 00:02:42,670 okamžitě vrátit n, které mají dostal int. 52 00:02:42,670 --> 00:02:47,180 Jinak, pokud sscanf nevrátí 1, a Uživatel tak nespolupracoval, 53 00:02:47,180 --> 00:02:51,470 stále volné čáru, ale my Nyní vyzve uživatele k zadání zopakovat. 54 00:02:51,470 --> 00:02:55,390 A protože jsme stále uvnitř, který jinak nekonečné smyčky, proces 55 00:02:55,390 --> 00:03:00,190 začne znovu, a možná znovu, a možná opět, dokud uživatel skutečně 56 00:03:00,190 --> 00:03:01,500 poskytuje nám int. 57 00:03:01,500 --> 00:03:21,490