2 00:00:00,000 --> 00:00:01,860 >> SPEAKER 1: Poďme sa pozrieť v knižnici CS50, 3 00:00:01,860 --> 00:00:05,190 konkrétne jeho vezmi_int funkcie. 4 00:00:05,190 --> 00:00:07,820 Tu máme skutočný zdroj Kód pre vezmi_int. 5 00:00:07,820 --> 00:00:12,050 A všimnite si, že to nie je príliš dlhá, a väčšina z nich predstavuje while - 6 00:00:12,050 --> 00:00:15,620 nekonečnej slučky na to - že iba vráti hodnotu, akonáhle máme vlastne 7 00:00:15,620 --> 00:00:17,400 dostal to, čo sme očakávali. 8 00:00:17,400 --> 00:00:18,700 Poďme si prejsť to. 9 00:00:18,700 --> 00:00:21,650 >> Všimnite si, až tú prvú, zatiaľ čo začína slučka. 10 00:00:21,650 --> 00:00:25,390 Všimnite si, že máme nasledujúci riadok kódu že vlastne volá GetString, 11 00:00:25,390 --> 00:00:29,620 a ukladá návratovú hodnotu v variabilný, volané linka, typu reťazec. 12 00:00:29,620 --> 00:00:31,210 Potom sme to trochu kontroly zdravý rozum. 13 00:00:31,210 --> 00:00:35,770 Ak je linka == null, potom sa zvedavo návrat INT_MAX. 14 00:00:35,770 --> 00:00:40,140 >> Teraz sa ukazuje, že INT_MAX je špeciálny konštanta deklarovaná inde 15 00:00:40,140 --> 00:00:44,030 , Ktorý určuje najväčší možný pravý, ktorý môže predstavovať v 16 00:00:44,030 --> 00:00:45,160 program, ako je tento. 17 00:00:45,160 --> 00:00:49,430 Teraz sme svojvoľne rozhodli k návratu INT_MAX Sentinel hodnotu 18 00:00:49,430 --> 00:00:53,120 druhy, ten, ktorý sme rezervovaný ako čo znamená, došlo k chybe. 19 00:00:53,120 --> 00:00:56,230 Takže cena, ktorú platíme, je samozrejme že vezmi_int môže zrejme nie je 20 00:00:56,230 --> 00:01:01,440 vlastne vracia číslo tak veľké, ako INT_MAX, pretože aj keď sa chce, 21 00:01:01,440 --> 00:01:04,730 že návratová hodnota by mala v skutočnosti byť interpretovaný volajúceho - 22 00:01:04,730 --> 00:01:06,260 kto ich používa vezmi_int - 23 00:01:06,260 --> 00:01:09,340 ako chybu nejakého druhu. 24 00:01:09,340 --> 00:01:13,840 >> Ďalej si všimnite, že som vyhlásil, int n a char c 25 00:01:13,840 --> 00:01:18,030 V tomto ďalšom riadku kódu, hovorím funkcie tzv sscanf, odovzdaním 26 00:01:18,030 --> 00:01:18,970 štyri argumenty. 27 00:01:18,970 --> 00:01:25,110 linka, čo je reťazec užívateľa zadal, "% i% c", čo je formát 28 00:01:25,110 --> 00:01:28,850 Reťazec, ktorý som očakával, môže užívateľ typ, nasledovaný adresou 29 00:01:28,850 --> 00:01:30,920 n, a adresa c 30 00:01:30,920 --> 00:01:34,860 Teraz sscanf je zmyslom života je skutočne skenovanie reťazec hľadá 31 00:01:34,860 --> 00:01:38,700 najmä vo formáte, ktorý programátor je uvedené ako ten druhý argument. 32 00:01:38,700 --> 00:01:42,020 V tomto prípade, aj% je v tam, ako je% c 33 00:01:42,020 --> 00:01:46,700 Takže ak sscanf narazí na int vstup užívateľa, bude, že int je uložený 34 00:01:46,700 --> 00:01:50,270 v premennej s názvom n, pretože sme poskytli ako tretí 35 00:01:50,270 --> 00:01:52,810 argument sscanf adresu n. 36 00:01:52,810 --> 00:01:56,870 Čo znamená, že sscanf skutočne môže ísť tam, a aktualizujte hodnotu v ňom. 37 00:01:56,870 --> 00:01:59,990 >> Teraz, v prípade, že používateľ zadá v niečo viac 38 00:01:59,990 --> 00:02:01,220 ako jednej alebo viacerých číslic - 39 00:02:01,220 --> 00:02:03,570 inými slovami, char nejakého druhu - 40 00:02:03,570 --> 00:02:07,940 že druhá premenná c, ktorého adresa sme prešli do sscanf ako štvrtý 41 00:02:07,940 --> 00:02:10,560 Argument sa tiež naplnená. 42 00:02:10,560 --> 00:02:14,220 Teraz nahor kontroly pre ďalší postava z užívateľov je 43 00:02:14,220 --> 00:02:17,360 že ak on alebo ona nespolupracuje, a druhy vo viac než len int, 44 00:02:17,360 --> 00:02:20,530 budeme môcť zistiť, že v tomto spôsobom, pretože v tomto prípade, sscanf 45 00:02:20,530 --> 00:02:24,860 sa chystá vrátiť 2, znamenať, že obaja zástupné symboly boli vyplnené 46 00:02:24,860 --> 00:02:25,600 s hodnotami. 47 00:02:25,600 --> 00:02:30,360 Ale my namiesto toho dúfa, že sscanf vráti 1, čo znamená, že iba užívateľ 48 00:02:30,360 --> 00:02:31,630 za predpokladu, int. 49 00:02:31,630 --> 00:02:34,480 >> Čo budeme robiť, keď sscanf naozaj vracia 1? 50 00:02:34,480 --> 00:02:39,150 No, sme okamžite uvoľniť linku, ktorá užívateľ zadal, a potom sme 51 00:02:39,150 --> 00:02:42,670 okamžite vrátiť n, ktoré majú dostal int. 52 00:02:42,670 --> 00:02:47,180 Inak, ak sscanf nevráti 1, a Užívateľ tak nespolupracoval, 53 00:02:47,180 --> 00:02:51,470 stále voľné čiaru, ale my Teraz vyzve užívateľa na zadanie zopakovať. 54 00:02:51,470 --> 00:02:55,390 A pretože sme stále vo vnútri, ktorý inak nekonečnej slučky, proces 55 00:02:55,390 --> 00:03:00,190 začne znova, a možno znovu, a možno opäť, kým používateľ skutočne 56 00:03:00,190 --> 00:03:01,500 poskytuje nám int. 57 00:03:01,500 --> 00:03:21,490