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] [Harvardin yliopisto] 3 00:00:04,220 --> 00:00:07,260 [Tämä on CS50. CS50.TV] 4 00:00:07,260 --> 00:00:11,510 CS50 kirjasto on hyödyllinen työkalu, joka meillä on asennettu laitteeseen 5 00:00:11,510 --> 00:00:15,870 helpottaa voit kirjoittaa ohjelmia nopeasti käyttäjien panos. 6 00:00:15,870 --> 00:00:21,670 Tässä videossa me vetää verhot ja katsoa mitä on CS50 kirjastossa. 7 00:00:21,670 --> 00:00:25,520 >> Vuonna video C-kirjastot, puhumme miten # include otsikot tiedostot 8 00:00:25,520 --> 00:00:27,570 ja kirjaston lähdekoodia, 9 00:00:27,570 --> 00:00:31,150 ja sitten linkittää binary kirjastotiedosto aikana yhdistää vaiheen 10 00:00:31,150 --> 00:00:33,140 laatimisen prosessin. 11 00:00:33,140 --> 00:00:36,440 Header tiedostot määrittää käyttöliittymän kirjastosta. 12 00:00:36,440 --> 00:00:41,280 Eli ne yksityiskohtaisesti kaikki resurssit kirjastossa on saatavilla voit käyttää, 13 00:00:41,280 --> 00:00:45,250 kuten funktio ilmoitukset, vakiot, ja tietotyyppejä. 14 00:00:45,250 --> 00:00:48,890 Binary kirjasto tiedosto sisältää täytäntöönpanoa kirjasto, 15 00:00:48,890 --> 00:00:54,580 joka on koottu kirjaston header tiedostot ja kirjaston. c lähdekooditiedostoja. 16 00:00:54,580 --> 00:00:59,820 >> Binary Kirjasto tiedostoa ei ole kovin mielenkiintoista tarkastella, koska se on hyvin, binary. 17 00:00:59,820 --> 00:01:03,300 Joten, nyt katsomaan header tiedostot kirjaston sijaan. 18 00:01:03,300 --> 00:01:07,710 Tässä tapauksessa on vain yksi otsikko tiedosto nimeltä cs50.h. 19 00:01:07,710 --> 00:01:11,040 Olemme asentanut sen käyttäjä ovat hakemistossa 20 00:01:11,040 --> 00:01:15,150 yhdessä muiden järjestelmän kirjastojen header-tiedostot. 21 00:01:15,150 --> 00:01:21,530 >> Yksi ensimmäisistä asioista, huomaat että cs50.h # sisältää header tiedostoja muista kirjastoista - 22 00:01:21,530 --> 00:01:25,670 float, rajoja, vakio bool ja standardi lib. 23 00:01:25,670 --> 00:01:28,800 Jälleen, sen jälkeen periaatetta ei pyörän keksimistä uudelleen, 24 00:01:28,800 --> 00:01:33,490 olemme rakentaneet CS0 kirjaston työkaluja, että muut säädetyt meille. 25 00:01:33,490 --> 00:01:38,690 >> Seuraava asia näet kirjastossa on, että me määrittelemme uudentyyppinen nimeltään "merkkijono". 26 00:01:38,690 --> 00:01:42,330 Tämä linja oikeastaan ​​vain luo alias char * tyyppi, 27 00:01:42,330 --> 00:01:46,000 joten se ei taianomaisesti kyllästää uusi merkkijono tyyppiä määritteitä 28 00:01:46,000 --> 00:01:49,650 yleisesti liittyvät merkkijono esineiden muilla kielillä, 29 00:01:49,650 --> 00:01:50,850 kuten pituus. 30 00:01:50,850 --> 00:01:55,180 Syy olemme tehneet tätä on suojata uudet ohjelmoijat verinen tiedot 31 00:01:55,180 --> 00:01:57,580 osoittimia, kunnes ne ovat valmiita. 32 00:01:57,580 --> 00:02:00,130 >> Seuraava osa header tiedosto on ilmoitus toimintojen 33 00:02:00,130 --> 00:02:04,410 että CS50 kirjasto tarjoaa mukana dokumentointi. 34 00:02:04,410 --> 00:02:06,940 Huomaa kuinka yksityiskohtaisia ​​kommentteja täällä. 35 00:02:06,940 --> 00:02:10,560 Tämä on erittäin tärkeää, jotta ihmiset tietävät, miten käyttää näitä toimintoja. 36 00:02:10,560 --> 00:02:19,150 Me julistamme, puolestaan ​​toimii pyytää käyttäjältä ja paluu merkkiä, tuplaa, kellukkeet, Ints, 37 00:02:19,150 --> 00:02:24,160 pitkä kaipaa, ja jouset, omilla merkkijono tyyppi. 38 00:02:24,160 --> 00:02:26,260 Periaatteen mukaisesti tiedonpiilotus, 39 00:02:26,260 --> 00:02:31,640 me olemme asettaneet määritelmä erilliseen. C täytäntöönpanosta file - cs50.c-- 40 00:02:31,640 --> 00:02:35,110 sijaitsevat käyttäjän lähdehakemistoon. 41 00:02:35,110 --> 00:02:38,040 Olemme kunhan tiedosto, jotta voit vilkaista sitä, 42 00:02:38,040 --> 00:02:41,490 opiksi, ja kääntää sen eri koneilla jos haluatte, 43 00:02:41,490 --> 00:02:45,510 vaikka mielestämme on parempi työskennellä laitteen tämän luokan. 44 00:02:45,510 --> 00:02:47,580 Anyway, katsotaanpa katsomaan sitä nyt. 45 00:02:49,020 --> 00:02:54,620 >> Toiminnot GetChar, GetDouble, GetFloat, GetInt, ja GetLongLong 46 00:02:54,620 --> 00:02:58,160 ovat kaikki rakennettu päälle GetString toiminnon. 47 00:02:58,160 --> 00:03:01,510 On käynyt ilmi, että ne kaikki noudattavat samaa kaavaa. 48 00:03:01,510 --> 00:03:04,870 He käyttävät taas silmukka pyytää käyttäjältä yhden rivin panos. 49 00:03:04,870 --> 00:03:08,430 He palaavat erityinen arvo, jos käyttäjä syöttää tyhjän rivin. 50 00:03:08,430 --> 00:03:11,750 He yrittävät jäsentää käyttäjän syöttää kuin sopivaa tyyppiä, 51 00:03:11,750 --> 00:03:15,010 olla se char, double, float, jne. 52 00:03:15,010 --> 00:03:18,710 Ja sitten he joko palauttaa tuloksen, jos tulo onnistuneesti jäsentää 53 00:03:18,710 --> 00:03:21,330 tai ne reprompt käyttäjälle. 54 00:03:21,330 --> 00:03:24,230 >> Korkealla tasolla, ei ole mitään todella hankala täällä. 55 00:03:24,230 --> 00:03:28,760 Olet ehkä kirjoittanut samanlainen rakenne koodin itse aikaisemmin. 56 00:03:28,760 --> 00:03:34,720 Ehkä kaikkein salaperäinen näköinen osa on sscanf puhelu, joka jäsentää käyttäjän syöttää. 57 00:03:34,720 --> 00:03:38,160 Sscanf on osa tulon muuntaminen perheeseen. 58 00:03:38,160 --> 00:03:42,300 Se elää standardin io.h, ja sen tehtävänä on jäsentää C merkkijono, 59 00:03:42,300 --> 00:03:46,520 mukaan tiettyyn muotoon, tallennetaan parse tulokset muuttuja 60 00:03:46,520 --> 00:03:48,720 edellyttäen, että soittajan. 61 00:03:48,720 --> 00:03:53,570 Koska tulo muuntaminen toiminnot ovat erittäin hyödyllisiä, laajasti käytettyihin toimintoihin 62 00:03:53,570 --> 00:03:56,160 jotka eivät ole erittäin intuitiivinen aluksi, 63 00:03:56,160 --> 00:03:58,300 menemme yli miten sscanf toimii. 64 00:03:58,300 --> 00:04:03,330 >> Ensimmäinen argumentti sscanf on char * - osoitin merkin. 65 00:04:03,330 --> 00:04:05,150 Jotta toiminto toimisi oikein, 66 00:04:05,150 --> 00:04:08,340 että merkki olisi ensimmäinen merkki C merkkijono, 67 00:04:08,340 --> 00:04:12,270 Päätetään null \ 0 luonnetta. 68 00:04:12,270 --> 00:04:15,120 Tämä on merkkijono jäsentää 69 00:04:15,120 --> 00:04:18,269 Toinen argumentti sscanf on muotomerkkijonoa, 70 00:04:18,269 --> 00:04:20,839 tyypillisesti kulunut niin string vakio, 71 00:04:20,839 --> 00:04:24,040 ja olet ehkä nähnyt merkkijono kuten tämä ennen kun käytät printf. 72 00:04:24,040 --> 00:04:28,650 Prosentin merkki muotomerkkijonoa ilmaisee muunnostarkennin. 73 00:04:28,650 --> 00:04:30,850 Merkki heti prosenttimerkki, 74 00:04:30,850 --> 00:04:35,430 ilmaisee C tyypin että haluamme sscanf muuntaa. 75 00:04:35,430 --> 00:04:40,090 Vuonna GetInt, näet, että on olemassa% d ja% c. 76 00:04:40,090 --> 00:04:48,690 Tämä tarkoittaa sitä, että sscanf pyrkii desimaalin int -% d - ja char -% c. 77 00:04:48,690 --> 00:04:51,510 Kunkin muunnostarkennin muotomerkkijonoa, 78 00:04:51,510 --> 00:04:56,620 sscanf odottaa vastaavaa väitettä myöhemmin parametrilistaus. 79 00:04:56,620 --> 00:05:00,850 Tämä väite pitää viitata asianmukaisesti kirjoitetaan sijainti 80 00:05:00,850 --> 00:05:04,000 jossa tallentaa muunnon seurauksena. 81 00:05:04,000 --> 00:05:08,910 >> Tyypillinen tapa tehdä tämä on luoda muuttuja pinoon ennen sscanf puhelun 82 00:05:08,910 --> 00:05:11,440 kunkin kohteen, jonka haluat jäsentää alkaen merkkijono 83 00:05:11,440 --> 00:05:15,520 ja sitten käyttää osoitetta operaattori - et-- siirtää osoittimia 84 00:05:15,520 --> 00:05:19,100 kuin muuttujia sscanf puhelun. 85 00:05:19,100 --> 00:05:22,720 Voit nähdä, että GetInt teemme juuri tätä. 86 00:05:22,720 --> 00:05:28,240 Juuri ennen sscanf puhelua, me julistamme int kutsutaan n ja char puhelu c pinoon, 87 00:05:28,240 --> 00:05:32,340 ja ohitamme osoittimia ne sscanf puhelun. 88 00:05:32,340 --> 00:05:35,800 Putting nämä muuttujat pinoon on parempana käyttää varattuun tilaan 89 00:05:35,800 --> 00:05:39,350 kasaan kanssa malloc, koska voit välttää overhead malloc puhelun 90 00:05:39,350 --> 00:05:43,060 ja sinun ei tarvitse murehtia vuotaa muistia. 91 00:05:43,060 --> 00:05:47,280 Hahmot eivät edeltää prosenttimerkkiä Älä pyydä muuntamista. 92 00:05:47,280 --> 00:05:50,380 Pikemminkin ne vain lisäävät muotomäärittelyä. 93 00:05:50,380 --> 00:05:56,500 >> Esimerkiksi jos muotomerkkijonoa vuonna GetInt oli% d sijaan, 94 00:05:56,500 --> 00:05:59,800 sscanf olisi etsittävä kirjeen jälkeen int- 95 00:05:59,800 --> 00:06:04,360 ja vaikka se yrittää muuntaa int, se ei tee mitään muuta kanssa. 96 00:06:04,360 --> 00:06:07,440 Ainoa poikkeus tähän on välilyönnit. 97 00:06:07,440 --> 00:06:11,030 Valkoinen merkkien muotomerkkijonoa vastaa mitään määrää välilyönti - 98 00:06:11,030 --> 00:06:12,890 jopa ei ollenkaan. 99 00:06:12,890 --> 00:06:18,100 Niin, siksi kommentti mainitsee mahdollisesti johtavien ja / tai perään välilyönnit. 100 00:06:18,100 --> 00:06:22,910 Joten tässä vaiheessa näyttää siltä, ​​että meidän sscanf puhelu yrittää jäsentää käyttäjän syötemerkkijonon 101 00:06:22,910 --> 00:06:25,380 tarkistamalla mahdollista välilyönnillä, 102 00:06:25,380 --> 00:06:29,300 seurasi int, joka muunnetaan ja tallennetaan int muuttuja n 103 00:06:29,300 --> 00:06:33,090 seurasi jonkin verran välilyönnit, ja sitä seurasi merkin 104 00:06:33,090 --> 00:06:35,810 tallennettu char muuttuja c. 105 00:06:35,810 --> 00:06:37,790 >> Entä paluuarvon? 106 00:06:37,790 --> 00:06:41,560 Sscanf jäsentää panos linja alusta loppuun, 107 00:06:41,560 --> 00:06:44,860 pysähtyy, kun se loppuu tai kun merkin syöttö 108 00:06:44,860 --> 00:06:49,320 ei vastaa muotoa merkin tai kun se ei voi tehdä muuntaminen. 109 00:06:49,320 --> 00:06:52,690 Se paluu arvoa käytetään erotella, kun se pysähtyi. 110 00:06:52,690 --> 00:06:55,670 Jos se pysähtynyt, koska sen lopussa syötemerkkijonon 111 00:06:55,670 --> 00:07:00,630 ennen kuin teet mitään tuloksia ja ennen jättämällä vastaamaan osaan muotomerkkijonoa, 112 00:07:00,630 --> 00:07:04,840 Sitten erityinen vakio EOF palautetaan. 113 00:07:04,840 --> 00:07:08,200 Muuten, se palauttaa useita onnistuneita tuloksia, 114 00:07:08,200 --> 00:07:14,380 joka voi olla 0, 1 tai 2, koska olemme pyytänyt kahta tuloksia. 115 00:07:14,380 --> 00:07:19,000 Meidän tapauksessa haluamme varmistaa, että käyttäjä kirjoittamaasi int ja vain int. 116 00:07:19,000 --> 00:07:23,370 >> Joten haluamme sscanf palata 1. Katso miksi? 117 00:07:23,370 --> 00:07:26,850 Jos sscanf tuotti 0, niin ei muunnoksia tehtiin 118 00:07:26,850 --> 00:07:31,690 joten käyttäjä kirjoittaa jotain muuta kuin int alussa tulon. 119 00:07:31,690 --> 00:07:37,100 Jos sscanf palauttaa 2, niin käyttäjä ei kunnolla kirjoittaa sen alussa tulo, 120 00:07:37,100 --> 00:07:41,390 mutta ne sitten kirjoitettu joitakin ei-välilyönti merkin jälkeen 121 00:07:41,390 --> 00:07:44,940 koska% c konversio onnistui. 122 00:07:44,940 --> 00:07:49,570 Vau, se on aika pitkä selitys yksi toiminto puhelun. 123 00:07:49,570 --> 00:07:53,460 Joka tapauksessa, jos haluat lisätietoja sscanf ja sen sisarukset, 124 00:07:53,460 --> 00:07:57,130 tutustu man sivut, Google, tai molemmat. 125 00:07:57,130 --> 00:07:58,780 On olemassa paljon muotomerkkijonoa vaihtoehtoja, 126 00:07:58,780 --> 00:08:03,830 ja näitä voi säästää paljon käsityötä kun yrittää jäsentää jousille C 127 00:08:03,830 --> 00:08:07,180 >> Lopullinen toiminto kirjaston tarkastella on GetString. 128 00:08:07,180 --> 00:08:10,310 On käynyt ilmi, että GetString on hankala funktio kirjoittaa oikein, 129 00:08:10,310 --> 00:08:14,290 vaikka se tuntuu niin yksinkertainen, yhteinen tehtävä. 130 00:08:14,290 --> 00:08:16,170 Miksi näin on? 131 00:08:16,170 --> 00:08:21,380 No, mieti, miten aiomme säilyttää linja, että käyttäjä tyypit sisään 132 00:08:21,380 --> 00:08:23,880 Koska merkkijono on sekvenssi merkkiä, 133 00:08:23,880 --> 00:08:26,430 saatamme haluta tallentaa sen array pinoon, 134 00:08:26,430 --> 00:08:31,250 mutta meidän olisi tiedettävä, kuinka kauan array tulee olemaan kun julistaa sen. 135 00:08:31,250 --> 00:08:34,030 Samoin, jos haluamme laittaa sen kasaan, 136 00:08:34,030 --> 00:08:38,090 meidän täytyy kulkea malloc tavujen haluamme varaukseen, 137 00:08:38,090 --> 00:08:39,730 mutta tämä on mahdotonta. 138 00:08:39,730 --> 00:08:42,760 Meillä ei ole aavistustakaan, kuinka monta merkkiä käyttäjä kirjoittaa 139 00:08:42,760 --> 00:08:46,590 ennen kuin käyttäjä itse ei kirjoita ne. 140 00:08:46,590 --> 00:08:50,720 >> Naiivi ratkaisu tähän ongelmaan on vain varata iso kimpale tilaa, eli 141 00:08:50,720 --> 00:08:54,540 lohko 1000 merkkiä varten käyttäjän syötteen mukaisesti, 142 00:08:54,540 --> 00:08:57,980 olettaen, että käyttäjä ei koskaan kirjoita merkkijono pitkä. 143 00:08:57,980 --> 00:09:00,810 Tämä on huono idea kahdesta syystä. 144 00:09:00,810 --> 00:09:05,280 Ensinnäkin, olettaen, että käyttäjät eivät yleensä kirjoita jouset niin kauan, 145 00:09:05,280 --> 00:09:07,610 voisit tuhlata paljon muistia. 146 00:09:07,610 --> 00:09:10,530 On nykyaikaiset koneet, tämä ei välttämättä ole ongelma, jos teet tämän 147 00:09:10,530 --> 00:09:13,890 yksi tai kaksi yksittäistä tapauksissa, 148 00:09:13,890 --> 00:09:17,630 mutta jos olet ottaen käyttäjän panos silmukka ja tallentaa myöhempää käyttöä varten, 149 00:09:17,630 --> 00:09:20,870 voit nopeasti imeä ton muistin. 150 00:09:20,870 --> 00:09:24,450 Lisäksi, jos ohjelma olet kirjoittamassa on pienempi tietokone - 151 00:09:24,450 --> 00:09:28,100 laite, kuten älypuhelin tai jotain muuta vähän muistia - 152 00:09:28,100 --> 00:09:32,060 tämä ratkaisu aiheuttaa ongelmia paljon nopeammin. 153 00:09:32,060 --> 00:09:36,450 Toinen, vakavampi syy tehdä tämä on, että se jättää ohjelman haavoittuvia 154 00:09:36,450 --> 00:09:39,710 mitä kutsutaan puskurin ylivuoto hyökkäys. 155 00:09:39,710 --> 00:09:45,840 Ohjelmoinnissa puskuri on käytettävä muisti tallentaa väliaikaisesti tulo tai lähtö dataa, 156 00:09:45,840 --> 00:09:48,980 joka tässä tapauksessa on meidän 1000-char lohko. 157 00:09:48,980 --> 00:09:53,370 Puskurin ylivuoto tapahtuu, kun tiedot on kirjoitettu pään ohi lohkon. 158 00:09:53,370 --> 00:09:57,790 >> Esimerkiksi, jos käyttäjä itse ei kirjoita yli 1000 merkkiä. 159 00:09:57,790 --> 00:10:01,570 Olet ehkä kokenut tätä vahingossa ohjelmoinnissa paneelit. 160 00:10:01,570 --> 00:10:05,620 Jos sinulla on joukko 10 ints, mikään ei estä sinua yrittää lukea tai kirjoittaa 161 00:10:05,620 --> 00:10:07,810 15. int. 162 00:10:07,810 --> 00:10:10,000 Ei ole kääntäjän varoituksia tai virheitä. 163 00:10:10,000 --> 00:10:13,250 Ohjelma vain kömmähdyksiä suoraan eteenpäin ja avaa muisti 164 00:10:13,250 --> 00:10:18,150 jos se katsoo 15. int tulee, ja tämä voi korvaa muita muuttujia. 165 00:10:18,150 --> 00:10:22,040 Pahimmassa tapauksessa voit korvata joitakin ohjelman sisäinen 166 00:10:22,040 --> 00:10:26,820 valvontamekanismeja, mikä ohjelma todella suorittaa erilaisia ​​ohjeita 167 00:10:26,820 --> 00:10:28,340 kuin tarkoitit. 168 00:10:28,340 --> 00:10:31,360 >> Nyt se ei ole yhteisiä tehdä tämän vahingossa, 169 00:10:31,360 --> 00:10:35,150 mutta tämä on melko yleinen tekniikka, että pahat pojat käyttävät rikkoa ohjelmia 170 00:10:35,150 --> 00:10:39,080 ja laittaa haitallista koodia muiden ihmisten tietokoneita. 171 00:10:39,080 --> 00:10:42,910 Siksi emme voi vain käyttää naiivi ratkaisu. 172 00:10:42,910 --> 00:10:45,590 Meidän tapa estää meidän ohjelmia alttiita 173 00:10:45,590 --> 00:10:47,880 on puskurin ylivuoto hyökkäys. 174 00:10:47,880 --> 00:10:51,430 Voit tehdä tämän, meidän täytyy varmistaa, että puskuri voi kasvaa, kun luemme 175 00:10:51,430 --> 00:10:53,850 Lisää tietoa käyttäjältä. 176 00:10:53,850 --> 00:10:57,440 Ratkaisu? Käytämme kasaan Allokoidun puskuri. 177 00:10:57,440 --> 00:10:59,950 Koska emme voi muuttaa sen käyttämällä resize realloc toiminto, 178 00:10:59,950 --> 00:11:04,580 ja me seurata kaksi numeroa - indeksi seuraavaan tyhjään puskurissa, 179 00:11:04,580 --> 00:11:08,390 ja pituus tai kapasiteettia puskuria. 180 00:11:08,390 --> 00:11:13,210 Luemme merkkiä käyttäjältä yksi kerrallaan käyttämällä fgetc toimintoa. 181 00:11:13,210 --> 00:11:19,360 Argumentti fgetc toiminto käynnistyy - stdin - on viittaus vakiosyötteestä merkkijono, 182 00:11:19,360 --> 00:11:23,810 joka on esikytketty tulokanava, jota käytetään siirtämään käyttäjän syöttämän 183 00:11:23,810 --> 00:11:26,270 päätelaitteelta ohjelman. 184 00:11:26,270 --> 00:11:29,890 >> Aina käyttäjä tyypit uusi hahmo, tarkistamme onko indeksin 185 00:11:29,890 --> 00:11:35,810 Seuraavan vapaa paikka plus 1 on suurempi kuin kapasiteetti puskuria. 186 00:11:35,810 --> 00:11:39,690 +1- Tulee koska jos seuraava vapaa indeksi on 5, 187 00:11:39,690 --> 00:11:44,150 Sitten meidän puskurin pituus on 6 kiitos 0 indeksointi. 188 00:11:44,150 --> 00:11:48,350 Jos olemme loppuu tilaa puskurin, niin yritämme muuttaa sitä, 189 00:11:48,350 --> 00:11:51,690 kaksinkertaistaa niin, että me leikata, kuinka monta kertaa, että me kokoa 190 00:11:51,690 --> 00:11:54,760 jos käyttäjä on kirjoittamalla todella pitkä jono. 191 00:11:54,760 --> 00:11:57,950 Jos merkkijono on mennyt liian kauan tai jos loppuu Heap muisti, 192 00:11:57,950 --> 00:12:01,350 me vapauttaa meidän puskurin ja return. 193 00:12:01,350 --> 00:12:04,170 >> Lopuksi, me liittää char että puskuriin. 194 00:12:04,170 --> 00:12:08,200 Kun käyttäjä painaa syöttää tai palata, signalointi uusi rivi, 195 00:12:08,200 --> 00:12:12,050 tai erityinen char - ohjaus d - joka viestittää lopussa tulon, 196 00:12:12,050 --> 00:12:16,240 teemme tarkistaa, jos käyttäjä itse kirjoittanut yhtään mitään. 197 00:12:16,240 --> 00:12:18,820 Jos ei, palaamme null. 198 00:12:18,820 --> 00:12:22,280 Muuten, koska meidän puskuri on todennäköisesti suurempi kuin meidän, 199 00:12:22,280 --> 00:12:24,830 pahimmassa tapauksessa se on lähes kaksi kertaa niin suuri kuin meidän 200 00:12:24,830 --> 00:12:27,830 koska meillä kaksinkertaistuu joka kerta kokoa, 201 00:12:27,830 --> 00:12:31,840 teemme uuden kopion merkkijono käyttäen vain paljon tilaa, että me tarvitsemme. 202 00:12:31,840 --> 00:12:34,220 Lisäämme ylimääräinen 1 malloc puhelun 203 00:12:34,220 --> 00:12:37,810 niin että siellä on tilaa erityistä null terminaattori merkki - \ 0, 204 00:12:37,810 --> 00:12:41,990 jota liittää merkkijonon kerran me kopioida muualla merkkiä, 205 00:12:41,990 --> 00:12:45,060 käyttämällä strncpy sijasta strcpy 206 00:12:45,060 --> 00:12:48,830 jotta voimme määritellä tarkasti, kuinka monta merkkiä haluamme kopioida. 207 00:12:48,830 --> 00:12:51,690 Strcpy kopioi kunnes se osuu \ 0. 208 00:12:51,690 --> 00:12:55,740 Sitten vapauttaa meidän puskurin ja palautettava kappale soittajalle. 209 00:12:55,740 --> 00:12:59,840 >> Kuka tiesi tällaisen yksinkertaisen näennäisestä toiminto voisi olla niin monimutkaista? 210 00:12:59,840 --> 00:13:02,820 Nyt tiedät mitä menee CS50 kirjastoon. 211 00:13:02,820 --> 00:13:06,470 >> Nimeni on Nate Hardison, ja tämä on CS50. 212 00:13:06,470 --> 00:13:08,350 [CS50.TV]