1 00:00:00,000 --> 00:00:02,490 [Powered by Google Translate] [CS50 biblioteka] 2 00:00:02,490 --> 00:00:04,220 [Nate Hardison] [Harvardo universiteto] 3 00:00:04,220 --> 00:00:07,260 [Tai CS50. CS50.TV] 4 00:00:07,260 --> 00:00:11,510 CS50 biblioteka yra naudingas įrankis, kad mes turime įdiegti prietaiso 5 00:00:11,510 --> 00:00:15,870 , kad būtų lengviau, kad galėtumėte rašyti programas, kad paskatins vartotojus Žaliavos. 6 00:00:15,870 --> 00:00:21,670 Šiame vaizdo, mes atsitraukti užuolaidą ir pažvelgti, kas tiksliai yra CS50 bibliotekoje. 7 00:00:21,670 --> 00:00:25,520 >> Vaizdo apie C bibliotekų, mes kalbame apie tai, kaip # include antraštes failus 8 00:00:25,520 --> 00:00:27,570 per kodo bibliotekos, 9 00:00:27,570 --> 00:00:31,150 ir tada jūs susieti su dvejetainiu susiejimo etapo metu bibliotekos failą 10 00:00:31,150 --> 00:00:33,140 rengimo procesą. 11 00:00:33,140 --> 00:00:36,440 Header files nurodyti bibliotekos sąsaja. 12 00:00:36,440 --> 00:00:41,280 Tai yra, jie visus išteklius, kad bibliotekoje yra jums naudoti, 13 00:00:41,280 --> 00:00:45,250 kaip funkcija deklaracijas, konstantų, ir duomenų tipai. 14 00:00:45,250 --> 00:00:48,890 Dvejetainis biblioteka failas yra bibliotekoje įgyvendinimą, 15 00:00:48,890 --> 00:00:54,580 kuris sudaromas iš bibliotekos header files ir c kodą failus biblioteka. 16 00:00:54,580 --> 00:00:59,820 >> Nėra labai įdomu pažvelgti, nes tai gerai, dvejetainis dvejetainis bibliotekos failą. 17 00:00:59,820 --> 00:01:03,300 Taigi, tegul bent antraščių failus į biblioteką, o ne išvaizdą. 18 00:01:03,300 --> 00:01:07,710 Šiuo atveju, antraštė yra tik vienas failas, kuris vadinamas cs50.h. 19 00:01:07,710 --> 00:01:11,040 Mes įdiegti jį į vartotojo katalogą 20 00:01:11,040 --> 00:01:15,150 kartu su kita sistema bibliotekų header files. 21 00:01:15,150 --> 00:01:21,530 >> Vienas iš pirmųjų dalykų, jūs pastebėsite, kad cs50.h # antraštės failus iš kitų bibliotekų - 22 00:01:21,530 --> 00:01:25,670 plūdės, ribos, standartinė bool, ir standartas lib. 23 00:01:25,670 --> 00:01:28,800 Vėlgi, ne dviračio išradinėjimo principą, 24 00:01:28,800 --> 00:01:33,490 mes pastatė CS0 biblioteką, naudojant įrankius, kad kiti numatytas mus. 25 00:01:33,490 --> 00:01:38,690 >> Kitas dalykas, jūs pamatysite bibliotekoje yra, kad mes apibrėžti naujo tipo vadinamas "string". 26 00:01:38,690 --> 00:01:42,330 Ši eilutė tikrai tik sukuria char * tipo alias, 27 00:01:42,330 --> 00:01:46,000 , todėl ji nėra stebuklingai Piesūcināt naujos eilutės tipą su atributais 28 00:01:46,000 --> 00:01:49,650 paprastai būna susijęs su virvele objektų kitomis kalbomis, 29 00:01:49,650 --> 00:01:50,850 kaip antai ilgis. 30 00:01:50,850 --> 00:01:55,180 Priežastis, mes padarėme tai yra apsaugoti naujų programuotojų Kalnai informacijos 31 00:01:55,180 --> 00:01:57,580 patarimų, kol jie pasiruošę. 32 00:01:57,580 --> 00:02:00,130 >> Kitas dalis antraštės faile yra funkcijų deklaracija 33 00:02:00,130 --> 00:02:04,410 CS50 bibliotekoje kartu su dokumentacija. 34 00:02:04,410 --> 00:02:06,940 Pranešimas išsamumo lygį komentarų. 35 00:02:06,940 --> 00:02:10,560 Tai yra super svarbu, kad žmonės žino, kaip naudoti šias funkcijas. 36 00:02:10,560 --> 00:02:19,150 Mes pareiškiame, savo ruožtu, veikia greitai vartotojo ir grąžinimo simbolių, dviviečiai, plūdes, int, 37 00:02:19,150 --> 00:02:24,160 seniai trokšta, ir styginiams, naudodami mūsų pačių string tipas. 38 00:02:24,160 --> 00:02:26,260 Informacijos slapstytis principo, 39 00:02:26,260 --> 00:02:31,640 turime įdėti mūsų atskiras c įgyvendinimo failo apibrėžimą - cs50.c - 40 00:02:31,640 --> 00:02:35,110 įsikūręs vartotojo šaltinio katalogą. 41 00:02:35,110 --> 00:02:38,040 Mes pateikiame šį failą, kad jūs galite pažvelgti į jį, 42 00:02:38,040 --> 00:02:41,490 iš jos pasimokyti, ir perkompiliuoti jį ant įvairių mašinų, jei norite, 43 00:02:41,490 --> 00:02:45,510 nors mes manome, kad geriau dirbti šios klasės prietaiso. 44 00:02:45,510 --> 00:02:47,580 Bet kokiu atveju, tegul dabar į jį pažvelgti. 45 00:02:49,020 --> 00:02:54,620 >> Funkcijos GetChar, GetDouble, GetFloat, GetInt, ir GetLongLong 46 00:02:54,620 --> 00:02:58,160 yra pastatytas ant GetString funkcija. 47 00:02:58,160 --> 00:03:01,510 Pasirodo, kad visi jie iš esmės tą patį modelį. 48 00:03:01,510 --> 00:03:04,870 Jie naudoja while cikle paskatinti vartotoją vienos linijos įvesties. 49 00:03:04,870 --> 00:03:08,430 Jie grįžta ypatingą vertę, jei vartotojas įėjimai tuščią eilutę. 50 00:03:08,430 --> 00:03:11,750 Jie bando išanalizuoti vartotojo įvestį kaip atitinkamo tipo, 51 00:03:11,750 --> 00:03:15,010 char, dvigubas, plūdės, ir tt 52 00:03:15,010 --> 00:03:18,710 Ir tada jie turi grąžinti rezultatą, jei įėjimo buvo sėkmingai apdoroti 53 00:03:18,710 --> 00:03:21,330 ar jie reprompt vartotoją. 54 00:03:21,330 --> 00:03:24,230 >> Aukštu lygiu, nėra nieko tikrai sudėtinga čia. 55 00:03:24,230 --> 00:03:28,760 Jūs panašios struktūros galėjo parašyti kodą save praeityje. 56 00:03:28,760 --> 00:03:34,720 Turbūt labiausiai paslaptingas išvaizdos dalis yra sscanf skambučio, kad analizuoja vartotojo įvestį. 57 00:03:34,720 --> 00:03:38,160 Sscanf yra dalis įvesties formato konvertavimo šeimos. 58 00:03:38,160 --> 00:03:42,300 Jis gyvena standartinio io.h ir jo darbas yra apdoroti C eilutę, 59 00:03:42,300 --> 00:03:46,520 pagal tam tikru formatu, saugoti Analizės rezultatai kintamojo 60 00:03:46,520 --> 00:03:48,720 numatyta skambintojui. 61 00:03:48,720 --> 00:03:53,570 Nuo įvesties formato konvertavimo funkcijos yra labai naudinga, plačiai naudojamas funkcijas 62 00:03:53,570 --> 00:03:56,160 kurie yra ne super intuityvus, pirmiausia, 63 00:03:56,160 --> 00:03:58,300 mes pereiti kaip sscanf veikia. 64 00:03:58,300 --> 00:04:03,330 >> Pirmasis argumentas sscanf char * - rodyklė į simbolį. 65 00:04:03,330 --> 00:04:05,150 Funkcija veiktų tinkamai, 66 00:04:05,150 --> 00:04:08,340 kad charakteris turėtų būti pirmasis simbolis C kalboje, 67 00:04:08,340 --> 00:04:12,270 nutraukta su nulinės \ 0 pobūdžio. 68 00:04:12,270 --> 00:04:15,120 Tai yra eilutė, išanalizuoti 69 00:04:15,120 --> 00:04:18,269 Antrasis argumentas sscanf yra format string, 70 00:04:18,269 --> 00:04:20,839 paprastai perduodamos kaip styginių konstantos, 71 00:04:20,839 --> 00:04:24,040 ir jūs galėjote pastebėti, kaip šis eilutę prieš naudojant printf. 72 00:04:24,040 --> 00:04:28,650 Procento ženklas formato eilutę rodo konversijos specyfikator. 73 00:04:28,650 --> 00:04:30,850 Pobūdis iš karto po procento ženklą, 74 00:04:30,850 --> 00:04:35,430 rodo C tipo, kad mes norime sscanf konvertuoti į. 75 00:04:35,430 --> 00:04:40,090 Be GetInt, jūs pamatysite, kad yra% d ir% c. 76 00:04:40,090 --> 00:04:48,690 Tai reiškia, kad sscanf bandys dešimtainis LC -% d ir char -% c. 77 00:04:48,690 --> 00:04:51,510 Kiekvienam konversijos specyfikator formato eilutę, 78 00:04:51,510 --> 00:04:56,620 sscanf tikisi atitinkantis argumentas vėliau jos argumentų sąrašą. 79 00:04:56,620 --> 00:05:00,850 Šis argumentas turi atkreipti dėmesį į tinkamai įvedėte vietoje 80 00:05:00,850 --> 00:05:04,000 laikyti konvertavimo rezultatą. 81 00:05:04,000 --> 00:05:08,910 >> Tipiškas būdas tai padaryti yra sukurti kintamąjį kamino iki sscanf skambučio 82 00:05:08,910 --> 00:05:11,440 už kiekvieną elementą, kurį norite apdoroti eilutę 83 00:05:11,440 --> 00:05:15,520 ir tada naudokite adresų operatorių - Ampersand - perduoti patarimų 84 00:05:15,520 --> 00:05:19,100 šių kintamųjų sscanf skambučio. 85 00:05:19,100 --> 00:05:22,720 Jūs galite pamatyti, kad GetInt mes darome būtent tai. 86 00:05:22,720 --> 00:05:28,240 Prieš pat sscanf skambučio mes pareiškiame vadinamos N int ir char skambučių C temperatūroje ant kamino, 87 00:05:28,240 --> 00:05:32,340 ir mes pereiname į juos patarimų į sscanf skambučio. 88 00:05:32,340 --> 00:05:35,800 Išleisti šiuos kintamuosius kamino pirmenybė naudojant vietos skirtos 89 00:05:35,800 --> 00:05:39,350 su malloc krūvą, nes jums išvengti važtaraščius malloc pokalbį, 90 00:05:39,350 --> 00:05:43,060 ir jūs neturite jaudintis dėl nesandarus atminties. 91 00:05:43,060 --> 00:05:47,280 Simboliai, priešdėliu procento ženklas NEPASAKINĖTI konversiją. 92 00:05:47,280 --> 00:05:50,380 O jie tiesiog pridėkite su formatavimo specifikacijos. 93 00:05:50,380 --> 00:05:56,500 >> Pavyzdžiui, jei buvo% d, o ne, format string GetInt 94 00:05:56,500 --> 00:05:59,800 sscanf atrodytų už laišką, po int 95 00:05:59,800 --> 00:06:04,360 ir nors ji bandyti konvertuoti int, tai nebūtų daryti nieko kito, su A. 96 00:06:04,360 --> 00:06:07,440 Vienintelė išimtis yra tai, tarpus. 97 00:06:07,440 --> 00:06:11,030 White Space simbolių formato eilutę neatitinka jokių tarpų kiekį - 98 00:06:11,030 --> 00:06:12,890 net iš viso nėra. 99 00:06:12,890 --> 00:06:18,100 Taigi, štai kodėl komentaras minima galbūt pirmaujančių ir / tarpus pradžioje arba pabaigoje. 100 00:06:18,100 --> 00:06:22,910 Taigi, šiuo metu jis panašus į mūsų sscanf skambučio stengsis išanalizuoti vartotojo įvestą eilutę, 101 00:06:22,910 --> 00:06:25,380 tikrinant galimą Tarpas, 102 00:06:25,380 --> 00:06:29,300 int, kad bus konvertuotas ir saugomi int kintamojo n 103 00:06:29,300 --> 00:06:33,090 kai kurių tarpų dydžio, ir po simbolį 104 00:06:33,090 --> 00:06:35,810 saugomas char kintamojo a. 105 00:06:35,810 --> 00:06:37,790 >> Ką apie sugrįžimo vertę? 106 00:06:37,790 --> 00:06:41,560 Sscanf bus apdoroti įvesties linijos nuo pradžios iki pabaigos, 107 00:06:41,560 --> 00:06:44,860 sustabdyti, kai jis pasiekia galutinį arba simbolį įvesties 108 00:06:44,860 --> 00:06:49,320 neatitinka formato pobūdžio arba kai jis negali padaryti konversiją. 109 00:06:49,320 --> 00:06:52,690 Tai sugrįžimas vertė yra naudojamas išskirti, kai jis sustojo. 110 00:06:52,690 --> 00:06:55,670 Jei jis sustojo, nes ji pasiekė įvesties stringo pabaigos 111 00:06:55,670 --> 00:07:00,630 prieš priimant bet kokį konversijas ir prieš nesugeba suderinti dalį formato eilutę 112 00:07:00,630 --> 00:07:04,840 tada speciali konstanta EOF yra grąžinamas. 113 00:07:04,840 --> 00:07:08,200 Priešingu atveju, ji grąžina sėkmingų konversijų skaičių, 114 00:07:08,200 --> 00:07:14,380 kuri galėtų būti 0, 1 arba 2, nes mes paprašėme dvi konversijų. 115 00:07:14,380 --> 00:07:19,000 Mūsų atveju, mes norime įsitikinti, kad vartotojas turi įvesti int ir tik int. 116 00:07:19,000 --> 00:07:23,370 >> Taigi, mes norime sscanf return 1. Suprasti, kodėl? 117 00:07:23,370 --> 00:07:26,850 Jei sscanf grįžo 0, tada buvo padaryti, jokios konversijos 118 00:07:26,850 --> 00:07:31,690 todėl vartotojas turi įvesti ką nors kitą, nei prie įėjimo pradžioje int. 119 00:07:31,690 --> 00:07:37,100 Jei sscanf grąžina 2, tada vartotojas nebuvo tinkamai įveskite jį įvesties pradžioje, 120 00:07:37,100 --> 00:07:41,390 bet tada jie įvestas po to kai ne tarpais pobūdžio 121 00:07:41,390 --> 00:07:44,940 nuo% c konversijos pavyko. 122 00:07:44,940 --> 00:07:49,570 Oho, tai gana ilgas paaiškinimas vieną skambinimo funkcijos. 123 00:07:49,570 --> 00:07:53,460 Bet kokiu atveju, jei norite daugiau informacijos apie sscanf ir jo broliai ir seserys, 124 00:07:53,460 --> 00:07:57,130 patikrinti Man puslapiai, "Google", arba abu. 125 00:07:57,130 --> 00:07:58,780 Format string variantų yra daug, 126 00:07:58,780 --> 00:08:03,830 ir jie gali jums sutaupyti daug rankų darbo, bandant apdoroti eilutes C. 127 00:08:03,830 --> 00:08:07,180 >> Galutinis bibliotekoje funkcija pažvelgti į tai, GetString. 128 00:08:07,180 --> 00:08:10,310 Pasirodo, kad GetString yra sudėtinga funkcija tinkamai rašyti, 129 00:08:10,310 --> 00:08:14,290 nors atrodo, kad toks paprastas, bendrą užduotį. 130 00:08:14,290 --> 00:08:16,170 Kodėl tai atveju? 131 00:08:16,170 --> 00:08:21,380 Na, galime galvoti apie tai, kaip mes ketiname saugoti liniją, kad vartotojas įveda in 132 00:08:21,380 --> 00:08:23,880 Kadangi eilutė yra simbolių seka, 133 00:08:23,880 --> 00:08:26,430 mes norime laikyti jį masyvo kamino, 134 00:08:26,430 --> 00:08:31,250 bet mums reikia žinoti, kiek bus masyvo, kai mes paskelbti ją suderinama su bendrąja rinka. 135 00:08:31,250 --> 00:08:34,030 Taip pat, jei mes norime įdėti jį į krūvą, 136 00:08:34,030 --> 00:08:38,090 turime pereiti į malloc baitų skaičių, norime rezervą, 137 00:08:38,090 --> 00:08:39,730 bet tai neįmanoma. 138 00:08:39,730 --> 00:08:42,760 Mes neturime jokio supratimo, kiek simbolių vartotojas turės įvesti 139 00:08:42,760 --> 00:08:46,590 kol vartotojas iš tikrųjų įveskite juos. 140 00:08:46,590 --> 00:08:50,720 >> , Naivus šios problemos sprendimas yra tiesiog rezervuoti didelė riekė erdvėje, tarkim, 141 00:08:50,720 --> 00:08:54,540 1000 simbolių vartotojo įvestį blokas, 142 00:08:54,540 --> 00:08:57,980 , darant prielaidą, kad vartotojas niekada įvesti į eilutę, kad ilgai. 143 00:08:57,980 --> 00:09:00,810 Tai yra bloga idėja dėl dviejų priežasčių. 144 00:09:00,810 --> 00:09:05,280 Pirma, darant prielaidą, kad vartotojai paprastai nereikia įvesti stygos, kad ilgai, 145 00:09:05,280 --> 00:09:07,610 jums gali gaišti daug atminties. 146 00:09:07,610 --> 00:09:10,530 Modernios mašinos, tai gali būti problema, jei jums tai padaryti 147 00:09:10,530 --> 00:09:13,890 vieno ar dviejų pavienių atvejų, 148 00:09:13,890 --> 00:09:17,630 tačiau, jei jūs vartojate vartotojo indėlį į kilpą ir saugoti vėlesniam naudojimui, 149 00:09:17,630 --> 00:09:20,870 galite greitai įsisiurbti atminties toną. 150 00:09:20,870 --> 00:09:24,450 Be to, jei programa rašote už mažesnę kompiuteryje 151 00:09:24,450 --> 00:09:28,100 kaip išmaniojo telefono arba kažkas su ribotos atminties įrenginys - 152 00:09:28,100 --> 00:09:32,060 šis sprendimas sukels problemų daug greičiau. 153 00:09:32,060 --> 00:09:36,450 Antra, daugiau rimtų priežasčių to padaryti, kad jis palieka savo programą pažeidžiami 154 00:09:36,450 --> 00:09:39,710 tai, kas vadinama buferio perpildymo ataka. 155 00:09:39,710 --> 00:09:45,840 Programavimą, atminties buferis yra naudojami laikinai saugoti įvesties arba išvesties duomenis, 156 00:09:45,840 --> 00:09:48,980 , kuri šiuo atveju yra mūsų 1000-char blokas. 157 00:09:48,980 --> 00:09:53,370 Buferio atsiranda tada, kai duomenys įrašomi praeities bloko pabaigos. 158 00:09:53,370 --> 00:09:57,790 >> Pavyzdžiui, jei vartotojas iš tiesų tipo daugiau nei 1000 simbolių. 159 00:09:57,790 --> 00:10:01,570 Galbūt patyrėte tai atsitiktinai, kai programavimo su matricomis. 160 00:10:01,570 --> 00:10:05,620 Jei turite 10 int masyvas, nieko sustabdo jus nuo bando skaityti ir rašyti 161 00:10:05,620 --> 00:10:07,810 15-oji vid. 162 00:10:07,810 --> 00:10:10,000 Yra jokių kompiliavimo įspėjimo ar klaidos. 163 00:10:10,000 --> 00:10:13,250 Programą tik suklydimų tiesiai į priekį, ir gauti prieigą prie atminties 164 00:10:13,250 --> 00:10:18,150 , kai, jos nuomone, 15 int bus, o tai gali perrašyti savo kitus kintamuosius. 165 00:10:18,150 --> 00:10:22,040 Blogiausiu atveju, galite perrašyti kai savo programą vidaus 166 00:10:22,040 --> 00:10:26,820 kontrolės mechanizmai, todėl savo programą faktiškai vykdyti skirtingas instrukcijas 167 00:10:26,820 --> 00:10:28,340 nei manėte. 168 00:10:28,340 --> 00:10:31,360 >> Dabar, tai neturi nieko bendro, tai padaryti netyčia, 169 00:10:31,360 --> 00:10:35,150 tačiau tai yra gana įprastas gydymo būdas, kad blogi vaikinai naudoti nutraukti programas 170 00:10:35,150 --> 00:10:39,080 ir įdėti kenksmingą kodą į kitų žmonių kompiuterius. 171 00:10:39,080 --> 00:10:42,910 Taigi, mes galime ne tik naudoti mūsų naivus sprendimą. 172 00:10:42,910 --> 00:10:45,590 Mes turime būdas užkirsti kelią savo programas yra pažeidžiami 173 00:10:45,590 --> 00:10:47,880 buferio perpildymo atakos. 174 00:10:47,880 --> 00:10:51,430 Norėdami tai padaryti, mes turime įsitikinti, kad mūsų buferis gali augti kaip mes skaitome 175 00:10:51,430 --> 00:10:53,850 daugiau įvestis iš vartotojo. 176 00:10:53,850 --> 00:10:57,440 Sprendimas? Mes naudojame krūvos Paskirti buferio. 177 00:10:57,440 --> 00:10:59,950 Kadangi mes galime pakeisti jo dydį naudodami Resize realloc funkciją, 178 00:10:59,950 --> 00:11:04,580 ir mes sekti du skaičiai - kitą tuščią lizdą indeksą į buferį 179 00:11:04,580 --> 00:11:08,390 o ilgis arba buferio talpa. 180 00:11:08,390 --> 00:11:13,210 Mes skaityti simbolių iš vartotojo viena vienu metu naudojant fgetc funkciją. 181 00:11:13,210 --> 00:11:19,360 Į fgetc funkcija priima stdin - argumentas yra nuoroda į standartinio įvesties eilutę, 182 00:11:19,360 --> 00:11:23,810 kuris yra užtikrintai įvesties kanalas, kuris yra naudojamas perduoti vartotojo indėlį 183 00:11:23,810 --> 00:11:26,270 iš terminalo į programą. 184 00:11:26,270 --> 00:11:29,890 >> Kai vartotojas įveda į naują pobūdį, mes tikriname, ar, jei indeksas 185 00:11:29,890 --> 00:11:35,810 kitą laisvą plyšį, plius 1 yra didesnis nei buferinės talpos. 186 00:11:35,810 --> 00:11:39,690 "+1 Ateina, nes jei kitas Laisvą indeksas yra 5, 187 00:11:39,690 --> 00:11:44,150 tada mūsų Slopintuvų ilgis turi būti 6 dėka 0 indeksavimo. 188 00:11:44,150 --> 00:11:48,350 Jei mes paleisti iš vietos buferyje, tada mes bandome pakeisti jo dydį, 189 00:11:48,350 --> 00:11:51,690 padvigubinti, kad galėtume sumažinti, kiek kartų, kad mes dydį 190 00:11:51,690 --> 00:11:54,760 jei vartotojas yra rašyti tikrai ilgą eilutę. 191 00:11:54,760 --> 00:11:57,950 Jei eilutė turi Dotarłeś per ilgas arba jei mes paleisti iš krūvos atminties, 192 00:11:57,950 --> 00:12:01,350 mes nemokamai mūsų buferis ir grąžina NULL. 193 00:12:01,350 --> 00:12:04,170 >> Galiausiai, mes pridėti char į buferį. 194 00:12:04,170 --> 00:12:08,200 Kai naudotojas paspaus įvesti arba grįžti, signalizacijos naują eilutę, 195 00:12:08,200 --> 00:12:12,050 arba specialus simbolis - valdymas D - kokie signalai galą įvesties, 196 00:12:12,050 --> 00:12:16,240 mes patikrinti, norėdami pamatyti, jei vartotojas iš tikrųjų įvedėte ką nors ne visi. 197 00:12:16,240 --> 00:12:18,820 Jei ne, mes grąžina NULL. 198 00:12:18,820 --> 00:12:22,280 Kitaip, nes mūsų buferis yra tikriausiai didesnis nei mums reikia, 199 00:12:22,280 --> 00:12:24,830 blogiausiu atveju, tai beveik du kartus didesnis, kaip mes turime 200 00:12:24,830 --> 00:12:27,830 nes mes du kartus kiekvieną kartą, dydį, 201 00:12:27,830 --> 00:12:31,840 eilutę, naudojant tik kiek vietos, kad mes turime naują kopiją. 202 00:12:31,840 --> 00:12:34,220 Mes pridėti papildomą 1 malloc skambutį, 203 00:12:34,220 --> 00:12:37,810 taip, kad specialios null terminatoriaus pobūdžio erdvė - \ 0 204 00:12:37,810 --> 00:12:41,990 kurios mes pridėti į eilutę, kai mes kopijuoti kitų veikėjų, 205 00:12:41,990 --> 00:12:45,060 naudojant strncpy vietoj strcpy 206 00:12:45,060 --> 00:12:48,830 taip, kad mes galime nurodyti tiksliai, kiek simbolių norite kopijuoti. 207 00:12:48,830 --> 00:12:51,690 Strcpy kopijuoja, kol ji hitai \ 0. 208 00:12:51,690 --> 00:12:55,740 Tada mes nemokamai mūsų buferio ir grąžina kopiją skambinančiajam. 209 00:12:55,740 --> 00:12:59,840 >> Kas žinojo, kad toks paprastas tariamas funkcija gali būti taip sudėtinga? 210 00:12:59,840 --> 00:13:02,820 Dabar jūs žinote, kas patenka į CS50 bibliotekoje. 211 00:13:02,820 --> 00:13:06,470 >> Mano vardas yra Nate Hardison, ir tai yra CS50. 212 00:13:06,470 --> 00:13:08,350 [CS50.TV]