1 00:00:00,000 --> 00:00:02,490 [Powered by Google Translate] [CS50 Library] 2 00:00:02,490 --> 00:00:04,220 [Nate Hardison] [Harvard University] 3 00:00:04,220 --> 00:00:07,260 [To je CS50. CS50.TV] 4 00:00:07,260 --> 00:00:11,510 Knižnica CS50 je užitočný nástroj, ktorý sme nainštalovali na spotrebiči 5 00:00:11,510 --> 00:00:15,870 aby to pre vás jednoduchšie písať programy, ktoré vyzve používateľa pre vstup. 6 00:00:15,870 --> 00:00:21,670 V tomto videu, budeme zatiahnite oponu a pozrieť sa na to, čo presne je v CS50 knižnici. 7 00:00:21,670 --> 00:00:25,520 >> Vo videu na knižnice C, hovoríme o tom, ako si # include hlavičke súbory 8 00:00:25,520 --> 00:00:27,570 z knižnice vo vašom zdrojovom kóde, 9 00:00:27,570 --> 00:00:31,150 a potom prepojiť s binárnym súboru knižnice počas linkovanie fázy 10 00:00:31,150 --> 00:00:33,140 z procesu kompilácie. 11 00:00:33,140 --> 00:00:36,440 Hlavičkové súbory špecifikáciu rozhrania v knižnici. 12 00:00:36,440 --> 00:00:41,280 To znamená, že detail všetkých zdrojov, ktoré má knižnica k dispozícii pre vás na použitie, 13 00:00:41,280 --> 00:00:45,250 ako deklarácia funkcie, konštanty a dátové typy. 14 00:00:45,250 --> 00:00:48,890 Binárny súbor knižnice obsahuje implementáciu knižnice, 15 00:00:48,890 --> 00:00:54,580 , Ktorý je zostavený z knižnice hlavičkové súbory a knižnice. C súbory zdrojových kódov. 16 00:00:54,580 --> 00:00:59,820 >> Binárny súbor s knižnicou nie je moc zaujímavé pozrieť sa na to, pretože, no, v binárnom formáte. 17 00:00:59,820 --> 00:01:03,300 Takže, poďme sa pozrieť na hlavičkových súborov pre knižnicu miesto. 18 00:01:03,300 --> 00:01:07,710 V tomto prípade je to iba jeden hlavičkový súbor nazvaný cs50.h. 19 00:01:07,710 --> 00:01:11,040 Sme inštalovali v užívateľskej obsahovať adresár 20 00:01:11,040 --> 00:01:15,150 spolu s hlavičkovým inom systéme knižníc súborov. 21 00:01:15,150 --> 00:01:21,530 >> Jedna z prvých vecí, ktoré si všimnete, je skutočnosť, že cs50.h # obsahuje hlavičkové súbory z iných knižníc - 22 00:01:21,530 --> 00:01:25,670 float, limity, štandardné bool a štandardné lib. 23 00:01:25,670 --> 00:01:28,800 Opäť, podľa zásady, že nie je objavovanie Ameriky, 24 00:01:28,800 --> 00:01:33,490 sme postavili CS0 knižnice pomocou nástrojov, ktoré ostatní stanovené pre nás. 25 00:01:33,490 --> 00:01:38,690 >> Ďalšia vec, ktorú uvidíte v knižnici je, že my môžeme definovať nový typ nazvaný "string". 26 00:01:38,690 --> 00:01:42,330 Táto linka naozaj len vytvára alias char * typ, 27 00:01:42,330 --> 00:01:46,000 takže to nie je magicky naplniť nový typ reťazca s atribútmi 28 00:01:46,000 --> 00:01:49,650 obyčajne spojené s fazuľovými objekty v iných jazykoch, 29 00:01:49,650 --> 00:01:50,850 ako je dĺžka. 30 00:01:50,850 --> 00:01:55,180 Dôvod, prečo sme urobili to je ochrániť nové programátorov z krvavých detailov 31 00:01:55,180 --> 00:01:57,580 ukazovateľov, kým nebudú pripravení. 32 00:01:57,580 --> 00:02:00,130 >> Ďalšia časť hlavičky súboru je deklarácia funkcií 33 00:02:00,130 --> 00:02:04,410 že CS50 knižnica poskytuje spoločne s dokumentáciou. 34 00:02:04,410 --> 00:02:06,940 Všimnite si, že úroveň podrobností v komentároch tu. 35 00:02:06,940 --> 00:02:10,560 To je super dôležité, aby ľudia vedeli, ako používať tieto funkcie. 36 00:02:10,560 --> 00:02:19,150 Prehlasujeme, v poradí, funguje vyzvať užívateľa a návrate znakov, dvojlôžkové, pláva, Ints, 37 00:02:19,150 --> 00:02:24,160 dlho túži, a reťazce, s použitím vlastnej typ reťazca. 38 00:02:24,160 --> 00:02:26,260 V súlade so zásadou skrývanie informácií, 39 00:02:26,260 --> 00:02:31,640 sme dali naše definície v samostatnom súbore implementácie písaná v C -. cs50.c-- 40 00:02:31,640 --> 00:02:35,110 sa nachádza v adresári užívateľa zdroje. 41 00:02:35,110 --> 00:02:38,040 Sme za predpokladu, že súbor, takže môžete sa pozrieť na to, 42 00:02:38,040 --> 00:02:41,490 sa z nej poučiť, a prekompilovať to na rôznych strojoch, ak si prajete, 43 00:02:41,490 --> 00:02:45,510 aj keď si myslíme, že je lepšie pracovať na zariadenia tejto triedy. 44 00:02:45,510 --> 00:02:47,580 Každopádne, poďme sa pozrieť na to teraz. 45 00:02:49,020 --> 00:02:54,620 >> Funkcia getchar, GetDouble, GetFloat, GetInt, a GetLongLong 46 00:02:54,620 --> 00:02:58,160 sú postavené na vrchole GetString funkcie. 47 00:02:58,160 --> 00:03:01,510 Ukazuje sa, že všetci riadiť v podstate rovnaký vzor. 48 00:03:01,510 --> 00:03:04,870 Oni používajú slučky while vyzvať užívateľa na jeden riadok vstupu. 49 00:03:04,870 --> 00:03:08,430 Oni sa vráti osobitnú hodnotu, pokiaľ užívateľ vstupy prázdnym riadkom. 50 00:03:08,430 --> 00:03:11,750 Snaží sa analyzovať vstup užívateľa ako vhodný typ, 51 00:03:11,750 --> 00:03:15,010 či už je to char, double, float, atď 52 00:03:15,010 --> 00:03:18,710 A potom buď vrátiť výsledok, ak vstup bol úspešne analyzovaný 53 00:03:18,710 --> 00:03:21,330 alebo sa reprompt užívateľa. 54 00:03:21,330 --> 00:03:24,230 >> Na vysokej úrovni, nie je nič naozaj zložité tu. 55 00:03:24,230 --> 00:03:28,760 Možno ste napísal podobne štruktúrovaná kód sami v minulosti. 56 00:03:28,760 --> 00:03:34,720 Snáď najviac mystický vyzerajúci časť je sscanf volanie, ktoré analyzuje vstup užívateľa. 57 00:03:34,720 --> 00:03:38,160 Sscanf je súčasťou konverzie vstupného formátu rodiny. 58 00:03:38,160 --> 00:03:42,300 Žije v io.h štandardné, a jeho úlohou je analyzovať reťazec C, 59 00:03:42,300 --> 00:03:46,520 podľa určitého formátu, ukladanie rozobrať výsledky v premennej 60 00:03:46,520 --> 00:03:48,720 poskytuje volajúcim. 61 00:03:48,720 --> 00:03:53,570 Vzhľadom k tomu, vstupné funkcie pre konverziu formátov sú veľmi užitočné, široko používané funkcie 62 00:03:53,570 --> 00:03:56,160 že nie sú Super intuitívne najprv, 63 00:03:56,160 --> 00:03:58,300 pôjdeme nad tým, ako sscanf funguje. 64 00:03:58,300 --> 00:04:03,330 >> Prvý argument sscanf je char * - ukazovateľ na znak. 65 00:04:03,330 --> 00:04:05,150 Pre funkcie pracovať správne, 66 00:04:05,150 --> 00:04:08,340 že postava by mala byť prvý znak reťazca C, 67 00:04:08,340 --> 00:04:12,270 ukončená s nulovým \ 0 znak. 68 00:04:12,270 --> 00:04:15,120 Toto je reťazec, ktorý má analyzovať 69 00:04:15,120 --> 00:04:18,269 Druhý argument sscanf je formátovací reťazec, 70 00:04:18,269 --> 00:04:20,839 zvyčajne odovzdaná ako reťazcová konštanta, 71 00:04:20,839 --> 00:04:24,040 a ste mohli vidieť reťazec, ako je tento pred pri použití printf. 72 00:04:24,040 --> 00:04:28,650 Znak percenta vo formátovacom reťazci označuje konverzie špecifikátory. 73 00:04:28,650 --> 00:04:30,850 Charakter bezprostredne po znak percenta, 74 00:04:30,850 --> 00:04:35,430 označuje typ C, ktoré chceme sscanf previesť na. 75 00:04:35,430 --> 00:04:40,090 V GetInt, uvidíte, že tam je% d, a% c 76 00:04:40,090 --> 00:04:48,690 To znamená, že sscanf bude snažiť desatinnou int -% d - a char - je% c 77 00:04:48,690 --> 00:04:51,510 Pre každý typ konverzie v parametri reťazec formáte, 78 00:04:51,510 --> 00:04:56,620 sscanf očakáva zodpovedajúce tvrdenie, neskôr v jeho zozname argumentov. 79 00:04:56,620 --> 00:05:00,850 Tento argument musí smerovať k zodpovedajúcim zadaný mieste 80 00:05:00,850 --> 00:05:04,000 do ktorého sa ukladajú výsledok konverzie. 81 00:05:04,000 --> 00:05:08,910 >> Typický spôsob, ako to urobiť, je vytvoriť premennú na zásobníku pred volaním sscanf 82 00:05:08,910 --> 00:05:11,440 pre každú položku, ktorú chcete analyzovať z reťazca 83 00:05:11,440 --> 00:05:15,520 a potom použite adresu operátora - ampersand - prejsť odkazy 84 00:05:15,520 --> 00:05:19,100 týchto premenných do hovoru sscanf. 85 00:05:19,100 --> 00:05:22,720 Môžete vidieť, že v GetInt robíme presne to. 86 00:05:22,720 --> 00:05:28,240 Tesne pred volanie sscanf, sme deklarovať int s názvom n a char volanie C na zásobníku, 87 00:05:28,240 --> 00:05:32,340 a míňame ukazovatele na ne do hovoru sscanf. 88 00:05:32,340 --> 00:05:35,800 Uvedenie týchto premenných na zásobníku je prednostné cez používanie priestor pridelený 89 00:05:35,800 --> 00:05:39,350 na halde s malloc, pretože sa vyhnete réžii malloc volanie, 90 00:05:39,350 --> 00:05:43,060 a nemusíte sa starať o úniku pamäte. 91 00:05:43,060 --> 00:05:47,280 Znaky nie sú predponou znakom percent nepobízejí konverziu. 92 00:05:47,280 --> 00:05:50,380 Skôr sa len pridať k špecifikácii formátu. 93 00:05:50,380 --> 00:05:56,500 >> Napríklad, v prípade, že reťazec formátu v GetInt boli% d miesto, 94 00:05:56,500 --> 00:05:59,800 sscanf vyzerať za písmenom a nasleduje int, 95 00:05:59,800 --> 00:06:04,360 a keď sa pokúsi previesť int, to by nebolo nič iného s A. 96 00:06:04,360 --> 00:06:07,440 Jedinou výnimkou je medzera. 97 00:06:07,440 --> 00:06:11,030 Biele medzery vo formátovacom reťazci nájdené žiadne množstvo medzerou - 98 00:06:11,030 --> 00:06:12,890 dokonca žiadny vôbec. 99 00:06:12,890 --> 00:06:18,100 Takže, to je dôvod, prečo komentár spomína prípadne s prednými a / alebo koncové medzery. 100 00:06:18,100 --> 00:06:22,910 Takže, bude v tomto bode to vyzerá ako naša sscanf hovoru pokúsi analyzovať užívateľa vstupný reťazec 101 00:06:22,910 --> 00:06:25,380 a kontrolovať prípadné vedúci medzerou, 102 00:06:25,380 --> 00:06:29,300 nasleduje int, ktorá bude premenená a uložené v int premennej n 103 00:06:29,300 --> 00:06:33,090 nasleduje nejakého množstva medzery, a nasleduje znak 104 00:06:33,090 --> 00:06:35,810 uložený v premennej char c 105 00:06:35,810 --> 00:06:37,790 >> Čo návratové hodnoty? 106 00:06:37,790 --> 00:06:41,560 Sscanf bude analyzovať vstupné riadku od začiatku do konca, 107 00:06:41,560 --> 00:06:44,860 zastavenie pri dosiahnutí konca alebo keď znak na vstupe 108 00:06:44,860 --> 00:06:49,320 nezodpovedá formátu charakter, alebo ak nie je možné uskutočniť prevod. 109 00:06:49,320 --> 00:06:52,690 Je to návrat hodnota sa používa vyčleniť, keď sa zastavil. 110 00:06:52,690 --> 00:06:55,670 Ak sa zastavil, pretože na konci vstupného reťazca 111 00:06:55,670 --> 00:07:00,630 pred vykonaním akejkoľvek konverzie a pred tým, že zápas časť formátovací reťazec, 112 00:07:00,630 --> 00:07:04,840 potom špeciálna konštanta EOF je vrátená. 113 00:07:04,840 --> 00:07:08,200 V opačnom prípade vráti počet úspešných konverzií, 114 00:07:08,200 --> 00:07:14,380 , Ktoré by mohli byť 0, 1 alebo 2, pretože sme požiadaní o dve konverzie. 115 00:07:14,380 --> 00:07:19,000 V našom prípade chceme, aby sa ubezpečil, že užívateľ napísané v int a iba na int. 116 00:07:19,000 --> 00:07:23,370 >> Takže, chceme sscanf vrátiť 1. Pozrite sa, prečo? 117 00:07:23,370 --> 00:07:26,850 Ak sscanf vrátil 0, potom žiadne prevody boli vykonané, 118 00:07:26,850 --> 00:07:31,690 takže užívateľ napísal niečo iné ako int na začiatku vstupu. 119 00:07:31,690 --> 00:07:37,100 Ak sscanf vráti 2, potom užívateľ sa riadne napíšte ju na začiatku vstupu, 120 00:07:37,100 --> 00:07:41,390 ale oni potom písali v nejakom non-prázdny znak potom 121 00:07:41,390 --> 00:07:44,940 od% c prevod úspešný. 122 00:07:44,940 --> 00:07:49,570 Wow, to je docela zdĺhavý vysvetlenie jednom volanie funkcie. 123 00:07:49,570 --> 00:07:53,460 Každopádne, ak chcete viac informácií o sscanf a jeho súrodenci, 124 00:07:53,460 --> 00:07:57,130 pozrite sa na manuálové stránky, Google, alebo oboje. 125 00:07:57,130 --> 00:07:58,780 Existuje veľa možností formátovacích reťazcov, 126 00:07:58,780 --> 00:08:03,830 a tie vám môže ušetriť veľa manuálnej práce, keď sa snažia analyzovať reťazca v jazyku C. 127 00:08:03,830 --> 00:08:07,180 >> Konečná funkcie v knižnici je pozrieť sa na GetString. 128 00:08:07,180 --> 00:08:10,310 Ukazuje sa, že GetString je zložité funkcie písať správne, 129 00:08:10,310 --> 00:08:14,290 aj keď sa to zdá ako taký jednoduchý, spoločnému úlohy. 130 00:08:14,290 --> 00:08:16,170 Prečo je tomu tak? 131 00:08:16,170 --> 00:08:21,380 No, poďme si o tom, ako budeme ukladať riadok, ktorý užívateľ zadá v 132 00:08:21,380 --> 00:08:23,880 Vzhľadom k tomu, reťazec je postupnosť znakov, 133 00:08:23,880 --> 00:08:26,430 by sme mohli chcieť uložiť ho do poľa na zásobníku, 134 00:08:26,430 --> 00:08:31,250 ale potrebovali by sme vedieť, ako dlho pole bude, keď sme vyhlásiť ju. 135 00:08:31,250 --> 00:08:34,030 Rovnako tak, ak chceme, aby to na hromadu, 136 00:08:34,030 --> 00:08:38,090 musíme prejsť malloc počet bajtov chceme rezervy, 137 00:08:38,090 --> 00:08:39,730 ale to je nemožné. 138 00:08:39,730 --> 00:08:42,760 Nemáme potuchy, koľko znakov bude užívateľ písať, 139 00:08:42,760 --> 00:08:46,590 predtým, než používateľ skutočne nemá písať. 140 00:08:46,590 --> 00:08:50,720 >> Naivné riešenie tohto problému je len rezervovať veľký kus priestoru, povedzme, 141 00:08:50,720 --> 00:08:54,540 blok 1000 znakov pre vstup užívateľa, 142 00:08:54,540 --> 00:08:57,980 za predpokladu, že užívateľ by nikdy zadať reťazec, ktorý dlho. 143 00:08:57,980 --> 00:09:00,810 To je zlý nápad to z dvoch dôvodov. 144 00:09:00,810 --> 00:09:05,280 Po prvé, za predpokladu, že používatelia zvyčajne nemajú písať v reťazcoch tak dlho, 145 00:09:05,280 --> 00:09:07,610 môžete odpad veľa pamäte. 146 00:09:07,610 --> 00:09:10,530 Na moderných strojoch, mohlo by to byť problém, ak to 147 00:09:10,530 --> 00:09:13,890 v jednom alebo dvoch ojedinelých prípadoch, 148 00:09:13,890 --> 00:09:17,630 ale ak užívate vstup užívateľa do slučky a skladovanie pre neskoršie použitie, 149 00:09:17,630 --> 00:09:20,870 môžete rýchlo vysať veľa pamäte. 150 00:09:20,870 --> 00:09:24,450 Navyše, ak sa program píšete je pre menšie počítače - 151 00:09:24,450 --> 00:09:28,100 zariadenia, ako je smartphone, alebo niečo iné s obmedzenou pamäťou - 152 00:09:28,100 --> 00:09:32,060 toto riešenie bude spôsobovať problémy oveľa rýchlejšie. 153 00:09:32,060 --> 00:09:36,450 Druhý, vážnejší dôvod to urobiť, je, že opustí svoj program zraniteľné 154 00:09:36,450 --> 00:09:39,710 na to, čo sa nazýva pretečeniu vyrovnávacej pamäte útok. 155 00:09:39,710 --> 00:09:45,840 V programovaní, vyrovnávacia pamäť je pamäť slúži na dočasné ukladanie vstupných alebo výstupných dát, 156 00:09:45,840 --> 00:09:48,980 čo v tomto prípade je naša 1000-char blok. 157 00:09:48,980 --> 00:09:53,370 Pretečeniu dochádza pri zápise dát za koncom bloku. 158 00:09:53,370 --> 00:09:57,790 >> Napríklad, ak užívateľ skutočne robí typ vo viac ako 1000 znakov. 159 00:09:57,790 --> 00:10:01,570 Možno ste to zažil náhodne pri programovaní s poľami. 160 00:10:01,570 --> 00:10:05,620 Ak máte rad 10 ints, nič nezastaví vás z pokusu o čítanie alebo zápis 161 00:10:05,620 --> 00:10:07,810 15. int. 162 00:10:07,810 --> 00:10:10,000 Nie sú žiadne upozornenie kompilátora alebo chyby. 163 00:10:10,000 --> 00:10:13,250 Program len prechmatov rovno a pristupuje pamäte 164 00:10:13,250 --> 00:10:18,150 kde si myslí, že 15. int bude, a to môže prepísať svoje ďalšie premenné. 165 00:10:18,150 --> 00:10:22,040 V najhoršom prípade môžete prepísať niektoré z vašich programu vnútornej 166 00:10:22,040 --> 00:10:26,820 kontrolné mechanizmy, čo váš program, aby skutočne vykonať rôzne inštrukcie 167 00:10:26,820 --> 00:10:28,340 , Ako ste zamýšľali. 168 00:10:28,340 --> 00:10:31,360 >> Teraz, to nie je bežné, aby to náhodou, 169 00:10:31,360 --> 00:10:35,150 ale je to celkom obyčajná technika, že protivníci používajú rozbiť programy 170 00:10:35,150 --> 00:10:39,080 a dal škodlivého kódu na počítači iných ľudí. 171 00:10:39,080 --> 00:10:42,910 Preto je možné nielen použiť náš naivné riešenie. 172 00:10:42,910 --> 00:10:45,590 Potrebujeme spôsob, ako zabrániť naše programy od bytia zraniteľné 173 00:10:45,590 --> 00:10:47,880 k pretečeniu vyrovnávacej pamäte útoku. 174 00:10:47,880 --> 00:10:51,430 Ak to chcete urobiť, musíme sa uistiť, že naša vyrovnávacej pamäte môže rásť, ako sme si 175 00:10:51,430 --> 00:10:53,850 viac vstup od užívateľa. 176 00:10:53,850 --> 00:10:57,440 Riešenie? Používame haldy pridelenej vyrovnávacej pamäte. 177 00:10:57,440 --> 00:10:59,950 Vzhľadom k tomu, môžeme zmeniť jeho veľkosť pomocou zmeniť veľkosť realloc funkciu, 178 00:10:59,950 --> 00:11:04,580 a sledujeme z dvoch čísel - index ďalšieho prázdneho slotu vo vyrovnávacej pamäti 179 00:11:04,580 --> 00:11:08,390 a dĺžka alebo kapacita pufri. 180 00:11:08,390 --> 00:11:13,210 Čítame v znakov z užívateľského jeden po druhom pomocou fgetc funkciu. 181 00:11:13,210 --> 00:11:19,360 The argument fgetc funkcie má - stdin - je odkaz na štandardný vstupný reťazec, 182 00:11:19,360 --> 00:11:23,810 ktorý je preconnected vstupný kanál, ktorý sa používa pre prenos vstup užívateľa 183 00:11:23,810 --> 00:11:26,270 z terminálu do programu. 184 00:11:26,270 --> 00:11:29,890 >> Kedykoľvek užívateľ zadá do nového charakteru, môžeme skontrolovať, či index 185 00:11:29,890 --> 00:11:35,810 ďalšieho voľného slotu plus 1 je väčší, než je kapacita vyrovnávacej pamäte. 186 00:11:35,810 --> 00:11:39,690 The 1 prichádza v, pretože v prípade, že ďalší voľný index je 5, 187 00:11:39,690 --> 00:11:44,150 potom naše vyrovnávacej pamäte dĺžka musí byť 6 vďaka 0 indexovanie. 188 00:11:44,150 --> 00:11:48,350 Ak sme došli priestoru vo vyrovnávacej pamäti, potom sa snažíme zmeniť jeho veľkosť, 189 00:11:48,350 --> 00:11:51,690 zdvojnásobenie to tak, že sa znížiť na to, koľkokrát sme veľkosť 190 00:11:51,690 --> 00:11:54,760 v prípade, že používateľ je písanie v naozaj dlhé reťazce. 191 00:11:54,760 --> 00:11:57,950 Ak reťazec dostal príliš dlho, alebo keď narazíme z haldy pamäte, 192 00:11:57,950 --> 00:12:01,350 sme oslobodiť naše vyrovnávacej pamäte a vráti hodnotu NULL. 193 00:12:01,350 --> 00:12:04,170 >> Nakoniec, pridáme char do vyrovnávacej pamäte. 194 00:12:04,170 --> 00:12:08,200 Akonáhle užívateľ stlačí Enter alebo Return, čo signalizuje nový riadok, 195 00:12:08,200 --> 00:12:12,050 alebo špeciálny znak - kontrolný d - čo signalizuje koniec vstupu, 196 00:12:12,050 --> 00:12:16,240 robíme Skontrolujte, či užívateľ skutočne zadali vôbec nič. 197 00:12:16,240 --> 00:12:18,820 Ak nie, vrátime null. 198 00:12:18,820 --> 00:12:22,280 V opačnom prípade, pretože náš vyrovnávacej pamäte je pravdepodobne väčšia, než potrebujeme, 199 00:12:22,280 --> 00:12:24,830 v najhoršom prípade je to takmer dvakrát tak veľká ako je potrebné 200 00:12:24,830 --> 00:12:27,830 pretože sme dvakrát zakaždým, keď sme zmeniť veľkosť, 201 00:12:27,830 --> 00:12:31,840 urobíme novú kópiu reťazca, iba pomocou množstvo priestoru, ktorý potrebujeme. 202 00:12:31,840 --> 00:12:34,220 Sme pridať ďalšie 1 k malloc volanie, 203 00:12:34,220 --> 00:12:37,810 tak, že je priestor pre špeciálne nulový znak terminátora - za \ 0, 204 00:12:37,810 --> 00:12:41,990 ktoré pridáme do reťazca, akonáhle budeme kopírovať vo zvyšku postáv, 205 00:12:41,990 --> 00:12:45,060 pomocou strncpy miesto strcpy 206 00:12:45,060 --> 00:12:48,830 takže môžeme presne určiť, koľko znakov chceme kopírovať. 207 00:12:48,830 --> 00:12:51,690 Strcpy kopíruje, kým nenarazí na \ 0. 208 00:12:51,690 --> 00:12:55,740 Potom sme oslobodiť naše vyrovnávacej pamäte a vráti kópiu volajúcemu. 209 00:12:55,740 --> 00:12:59,840 >> Kto vedel, že taký jednoduchý vyzerajúce funkcie by mala byť tak zložité? 210 00:12:59,840 --> 00:13:02,820 Teraz už viete, čo ide do CS50 knižnice. 211 00:13:02,820 --> 00:13:06,470 >> Moje meno je Nate Hardison, a to je CS50. 212 00:13:06,470 --> 00:13:08,350 [CS50.TV]