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] [Universiteti i Harvardit] 3 00:00:04,220 --> 00:00:07,260 [Kjo është CS50. CS50.TV] 4 00:00:07,260 --> 00:00:11,510 Biblioteka CS50 është një mjet i dobishëm që kemi instaluar në aplikim 5 00:00:11,510 --> 00:00:15,870 për ta bërë të lehtë për ju për të shkruar programe që përdoruesit të shpejtë për input. 6 00:00:15,870 --> 00:00:21,670 Në këtë video, ne do të tërheq mbrapsht perde dhe të shikojmë se çfarë saktësisht është në bibliotekë CS50. 7 00:00:21,670 --> 00:00:25,520 >> Në video në bibliotekat C, ne flasim rreth asaj se si ju të përfshijë # headers fotografi 8 00:00:25,520 --> 00:00:27,570 i bibliotekës në kodin tuaj burim, 9 00:00:27,570 --> 00:00:31,150 dhe pastaj ju lidhje me një file binar bibliotekës gjatë fazës lidh 10 00:00:31,150 --> 00:00:33,140 e procesit të kolazhin. 11 00:00:33,140 --> 00:00:36,440 Fotografi header specifikojë ndërfaqen e bibliotekës. 12 00:00:36,440 --> 00:00:41,280 Kjo është, ato detaje të gjitha burimeve që biblioteka ka në dispozicion për ju për të përdorur, 13 00:00:41,280 --> 00:00:45,250 si deklarimeve funksion, konstantet, dhe lloje të të dhënave. 14 00:00:45,250 --> 00:00:48,890 File binar Biblioteka përmban zbatimin e bibliotekës, 15 00:00:48,890 --> 00:00:54,580 e cila është hartuar nga dosjet e bibliotekës header dhe të bibliotekës. kod burim c fotografi. 16 00:00:54,580 --> 00:00:59,820 >> File binar Biblioteka nuk është shumë interesante për të parë që ajo është, mirë, në binar. 17 00:00:59,820 --> 00:01:03,300 Pra, le të marrin një vështrim në dosjet header për bibliotekën vend. 18 00:01:03,300 --> 00:01:07,710 Në këtë rast, ka vetëm një file header quajtur cs50.h. 19 00:01:07,710 --> 00:01:11,040 Ne kemi instaluar atë në përdorues të përfshijë në dosjen 20 00:01:11,040 --> 00:01:15,150 së bashku me fotografi bibliotekat e tjera të sistemit header. 21 00:01:15,150 --> 00:01:21,530 >> Një nga gjërat e para që ju do të vëreni është se cs50.h # përfshin fotografi header nga bibliotekat e tjera - 22 00:01:21,530 --> 00:01:25,670 noton, kufijtë, bool standarde, dhe standarde lib. 23 00:01:25,670 --> 00:01:28,800 Përsëri, ndjekur parimin e mos Reinventing timon, 24 00:01:28,800 --> 00:01:33,490 ne kemi ndërtuar bibliotekën CS0 duke përdorur mjetet që të tjera të parashikuara për ne. 25 00:01:33,490 --> 00:01:38,690 >> Gjë tjetër që ju do të shihni në bibliotekë është se ne të përcaktojë një lloj të ri të quajtur "string". 26 00:01:38,690 --> 00:01:42,330 Kjo linjë të vërtetë vetëm krijon një pseudonim për llojin char *, 27 00:01:42,330 --> 00:01:46,000 kështu që nuk ka magjike mbushë lloj të ri string me atributet 28 00:01:46,000 --> 00:01:49,650 lidhur zakonisht me objekte string në gjuhë të tjera, 29 00:01:49,650 --> 00:01:50,850 të tilla si gjatësi. 30 00:01:50,850 --> 00:01:55,180 Arsyeja që ne kemi bërë këtë është që të mbrojë programuesit të reja nga detajet gjakosur 31 00:01:55,180 --> 00:01:57,580 i pointers derisa ata janë të gatshëm. 32 00:01:57,580 --> 00:02:00,130 >> Pjesa tjetër e file header është deklarimi i funksioneve 33 00:02:00,130 --> 00:02:04,410 se CS50 Biblioteka ofron së bashku me dokumentacionin. 34 00:02:04,410 --> 00:02:06,940 Njoftim nivelin e detaje në komente këtu. 35 00:02:06,940 --> 00:02:10,560 Kjo është super i rëndësishëm në mënyrë që njerëzit të dinë se si të përdorin këto funksione. 36 00:02:10,560 --> 00:02:19,150 Ne deklarojmë, nga ana tjetër, funksionon me të shpejtë e përdoruesit dhe chars kthim, dyshe, gjithandej, ints, 37 00:02:19,150 --> 00:02:24,160 gjatë dëshiron, dhe vargjet, duke përdorur llojin e vet tonë string. 38 00:02:24,160 --> 00:02:26,260 Duke ndjekur parimin e fshehur informacionit, 39 00:02:26,260 --> 00:02:31,640 ne kemi vënë përkufizimin tonë në një skedar të veçantë zbatimit të c -. cs50.c-- 40 00:02:31,640 --> 00:02:35,110 vendosur në directory burim përdoruesit. 41 00:02:35,110 --> 00:02:38,040 Ne kemi dhënë atë fotografi në mënyrë që ju mund të marrë një vështrim në atë, 42 00:02:38,040 --> 00:02:41,490 të mësojnë prej saj, dhe recompile atë në makina të ndryshme në qoftë se ju dëshironi, 43 00:02:41,490 --> 00:02:45,510 edhe pse ne mendojmë se është më mirë për të punuar në aplikim për këtë klasë. 44 00:02:45,510 --> 00:02:47,580 Gjithsesi, le të marrin një vështrim në atë tani. 45 00:02:49,020 --> 00:02:54,620 >> Funksionet GetChar, GetDouble, GetFloat, GetInt, dhe GetLongLong 46 00:02:54,620 --> 00:02:58,160 janë ndërtuar të gjitha në krye të funksionit getString. 47 00:02:58,160 --> 00:03:01,510 Ajo rezulton se të gjithë ata ndjekin në thelb të njëjtin model. 48 00:03:01,510 --> 00:03:04,870 Ata përdorin një lak, ndërsa të menjëhershëm të përdoruesit për një linjë të dhëna. 49 00:03:04,870 --> 00:03:08,430 Ata kthehen një vlerë të veçantë në qoftë se përdoruesi inputeve një vijë e zbrazët. 50 00:03:08,430 --> 00:03:11,750 Ata përpiqen të kuptoj kontributin e përdoruesit si lloji të përshtatshëm, 51 00:03:11,750 --> 00:03:15,010 të jetë ajo një char, një dopio, një noton, etj 52 00:03:15,010 --> 00:03:18,710 Dhe pastaj ata ose të kthehen rezultatin nëse input u parsed sukses 53 00:03:18,710 --> 00:03:21,330 ose ata reprompt përdorues. 54 00:03:21,330 --> 00:03:24,230 >> Në një nivel të lartë, nuk ka asgjë të vërtetë e ndërlikuar këtu. 55 00:03:24,230 --> 00:03:28,760 Ju mund të keni shkruar kodin ngjashme strukturuar veten në të kaluarën. 56 00:03:28,760 --> 00:03:34,720 Ndoshta pjesa më e fshehtë-looking është thirrja që sscanf parses input të përdoruesit. 57 00:03:34,720 --> 00:03:38,160 Sscanf është pjesë e familjes format input konvertimit. 58 00:03:38,160 --> 00:03:42,300 Ajo jeton në io.h standarde, dhe puna e tij është të kuptoj një varg C, 59 00:03:42,300 --> 00:03:46,520 sipas një format të veçantë, ruajtja e rezultateve të kuptoj në të ndryshueshme 60 00:03:46,520 --> 00:03:48,720 dhënë nga telefonuesi. 61 00:03:48,720 --> 00:03:53,570 Që nga funksionet format input konvertimit janë shumë të dobishme, funksionet e përdorur gjerësisht 62 00:03:53,570 --> 00:03:56,160 që nuk janë super intuitive në fillim, 63 00:03:56,160 --> 00:03:58,300 ne do të shkojnë mbi atë se si punon sscanf. 64 00:03:58,300 --> 00:04:03,330 >> Argumenti i parë për sscanf është një char * - një tregues për një karakter. 65 00:04:03,330 --> 00:04:05,150 Për funksioni për të punuar si duhet, 66 00:04:05,150 --> 00:04:08,340 se karakteri duhet të jetë karakteri i parë i një varg C, 67 00:04:08,340 --> 00:04:12,270 ndërprerë me karakter \ null 0. 68 00:04:12,270 --> 00:04:15,120 Ky është vargu të kuptoj 69 00:04:15,120 --> 00:04:18,269 Argumenti i dytë për sscanf është një format string, 70 00:04:18,269 --> 00:04:20,839 kaluar në mënyrë tipike në si një konstante string, 71 00:04:20,839 --> 00:04:24,040 dhe ju mund të keni parë një varg si kjo para kur duke përdorur printf. 72 00:04:24,040 --> 00:04:28,650 Një shenjë qind në vargun format tregon një specifier konvertimit. 73 00:04:28,650 --> 00:04:30,850 Karakteri menjëherë pas një shenjë për qind, 74 00:04:30,850 --> 00:04:35,430 tregon llojin C se ne duam sscanf për të kthyer në. 75 00:04:35,430 --> 00:04:40,090 Në GetInt, ju shihni se ka një d% dhe c%. 76 00:04:40,090 --> 00:04:48,690 Kjo do të thotë se do të përpiqet të sscanf një int decimal d -% - dhe një char - C%. 77 00:04:48,690 --> 00:04:51,510 Për çdo specifier konvertimit në formatin vargut, 78 00:04:51,510 --> 00:04:56,620 sscanf pret një argument korrespondon më vonë në listën e saj argument. 79 00:04:56,620 --> 00:05:00,850 Se argumenti duhet të vënë në një vend të duhur typed 80 00:05:00,850 --> 00:05:04,000 në të cilat për të ruajtur rezultatin e konvertimit. 81 00:05:04,000 --> 00:05:08,910 >> Mënyra tipike e bërë këtë është të krijojë një ndryshore në rafte para thirrjes sscanf 82 00:05:08,910 --> 00:05:11,440 për çdo send që ju doni të kuptoj nga vargu 83 00:05:11,440 --> 00:05:15,520 dhe pastaj të përdorin operatorin e adresave - e simbol - të kalojë pointers 84 00:05:15,520 --> 00:05:19,100 këtyre variablave të thirrjes sscanf. 85 00:05:19,100 --> 00:05:22,720 Ju mund të shihni se në GetInt bëjmë pikërisht këtë. 86 00:05:22,720 --> 00:05:28,240 Drejtë para thirrjes sscanf, ne deklarojmë një int n quajtur dhe një char c thirrje në rafte, 87 00:05:28,240 --> 00:05:32,340 dhe ne të kalojë pointers të tyre në thirrjen sscanf. 88 00:05:32,340 --> 00:05:35,800 Vënë këto variabla në rafte është e preferuar mbi përdorimin e hapësirës caktuar 89 00:05:35,800 --> 00:05:39,350 në tog me malloc, që ju të shmangur lart e thirrjes malloc, 90 00:05:39,350 --> 00:05:43,060 dhe ju nuk keni për t'u shqetësuar për rrjedhjen e kujtesës. 91 00:05:43,060 --> 00:05:47,280 Personazhet nuk prefixed nga një shenjë për qind nuk shpejtë konvertimit. 92 00:05:47,280 --> 00:05:50,380 Përkundrazi ata vetëm të shtoni në specifikimet format. 93 00:05:50,380 --> 00:05:56,500 >> Për shembull, nëse string format në GetInt ishte një d% në vend, 94 00:05:56,500 --> 00:05:59,800 sscanf do të shikojmë për një letër e ndjekur nga një int, 95 00:05:59,800 --> 00:06:04,360 dhe ndërsa kjo do të përpiqet për të kthyer int, ajo nuk do të bëjë asgjë tjetër me një. 96 00:06:04,360 --> 00:06:07,440 Përjashtimi i vetëm për këtë është hapësira të bardha. 97 00:06:07,440 --> 00:06:11,030 White karaktere hapësirë ​​në vargun formatin përputhen me ndonjë sasi e whitespace - 98 00:06:11,030 --> 00:06:12,890 edhe asnjë në të gjitha. 99 00:06:12,890 --> 00:06:18,100 Pra, kjo është arsyeja pse komenti përmend ndoshta me kryesorë dhe / ose zvarritës whitespace. 100 00:06:18,100 --> 00:06:22,910 Pra, në këtë pikë ajo duket si thirrjen tonë sscanf do të përpiqet të kuptoj vargun e përdoruesit input 101 00:06:22,910 --> 00:06:25,380 duke kontrolluar për whitespace mundshme kryesor, 102 00:06:25,380 --> 00:06:29,300 ndjekur nga një int që do të konvertohet dhe ruajtur në n ndryshueshme int 103 00:06:29,300 --> 00:06:33,090 pasuar nga disa shuma e whitespace, dhe e ndjekur nga një karakter 104 00:06:33,090 --> 00:06:35,810 ruhen në c char ndryshueshme. 105 00:06:35,810 --> 00:06:37,790 >> Po në lidhje me vlerën e kthimit? 106 00:06:37,790 --> 00:06:41,560 Sscanf do analizimi linjë input nga fillimi në fund, 107 00:06:41,560 --> 00:06:44,860 ndalimin e kur ajo arrin në fund, ose kur një karakter në input 108 00:06:44,860 --> 00:06:49,320 nuk përputhet me një karakter format ose kur ajo nuk mund të bëjë një konvertim. 109 00:06:49,320 --> 00:06:52,690 Vlera është e kthimit është përdorur për të vetëm kur ajo u ndal. 110 00:06:52,690 --> 00:06:55,670 Në qoftë se ajo u ndal, sepse ajo arriti në fund të vargut të dhëna 111 00:06:55,670 --> 00:07:00,630 përpara se të bëjnë ndonjë conversions dhe para dështuar në ndeshjen pjesë të string format, 112 00:07:00,630 --> 00:07:04,840 pastaj EOF veçantë konstante është kthyer. 113 00:07:04,840 --> 00:07:08,200 Përndryshe, ai kthehet numrin e konvertimeve të suksesshme, 114 00:07:08,200 --> 00:07:14,380 cila mund të jetë 0, 1, ose 2, që ne kam kërkuar për dy konvertimet. 115 00:07:14,380 --> 00:07:19,000 Në rastin tonë, ne duam të sigurohemi që përdoruesi typed në një int dhe vetëm një Int. 116 00:07:19,000 --> 00:07:23,370 >> Pra, ne duam sscanf të kthehen 1. Shih pse? 117 00:07:23,370 --> 00:07:26,850 Nëse sscanf kthye 0, atëherë nuk ka konvertimet janë bërë, 118 00:07:26,850 --> 00:07:31,690 në mënyrë që përdoruesit shtypur diçka tjetër se një int në fillim të input. 119 00:07:31,690 --> 00:07:37,100 Nëse sscanf kthen 2, atëherë përdoruesi nuk duhet të shkruani atë në në fillim të input, 120 00:07:37,100 --> 00:07:41,390 por ato shtypen më pas në disa karakter jo-whitespace pas 121 00:07:41,390 --> 00:07:44,940 që nga% c konvertimit sukses. 122 00:07:44,940 --> 00:07:49,570 Wow, kjo është krejt një shpjegim të gjatë për një thirrje të funksionit. 123 00:07:49,570 --> 00:07:53,460 Gjithsesi, në qoftë se ju doni më shumë informacion mbi sscanf dhe vëllezërit e motrat e saj, 124 00:07:53,460 --> 00:07:57,130 shikoni faqet e njeri, Google, ose të dyja. 125 00:07:57,130 --> 00:07:58,780 Ka shumë opsione string format, 126 00:07:58,780 --> 00:08:03,830 dhe këto mund të ju kursejnë një shumë të punës manual kur duke u përpjekur të kuptoj vargjet në C. 127 00:08:03,830 --> 00:08:07,180 >> Funksioni përfundimtar në bibliotekë për të parë në është getString. 128 00:08:07,180 --> 00:08:10,310 Ajo rezulton se getString është një funksion i ndërlikuar për të shkruar si duhet, 129 00:08:10,310 --> 00:08:14,290 edhe pse kjo duket si një detyrë të tillë të thjeshtë, të përbashkët. 130 00:08:14,290 --> 00:08:16,170 Pse është ky rast? 131 00:08:16,170 --> 00:08:21,380 E pra, le të mendojmë rreth asaj se si ne jemi duke shkuar për të ruajtur vijën që përdoruesi lloje in 132 00:08:21,380 --> 00:08:23,880 Që një varg është një sekuencë e karaktere, 133 00:08:23,880 --> 00:08:26,430 ne mund të dëshironi të ruani atë në një grup në rafte, 134 00:08:26,430 --> 00:08:31,250 por ne do të duhet të dini se sa kohë array do të jetë kur ne e deklarojnë atë. 135 00:08:31,250 --> 00:08:34,030 Gjithashtu, në qoftë se ne duam të vënë atë në mur, 136 00:08:34,030 --> 00:08:38,090 ne kemi nevojë për të kaluar në malloc numrin e bytes ne duam të rezervave, 137 00:08:38,090 --> 00:08:39,730 por kjo është e pamundur. 138 00:08:39,730 --> 00:08:42,760 Ne nuk kemi asnjë ide se sa chars përdoruesit do të shkruani në 139 00:08:42,760 --> 00:08:46,590 para se përdoruesi të vërtetë nuk shkruani ato. 140 00:08:46,590 --> 00:08:50,720 >> Një zgjidhje naive për këtë problem është që të rezervoj vetëm një copë të madhe të hapësirës, ​​të themi, 141 00:08:50,720 --> 00:08:54,540 një bllok prej 1000 karaktere për kontributin e përdoruesit, 142 00:08:54,540 --> 00:08:57,980 duke supozuar që përdoruesit kurrë nuk do të shkruani në një varg që gjatë. 143 00:08:57,980 --> 00:09:00,810 Kjo është një ide e keqe për dy arsye. 144 00:09:00,810 --> 00:09:05,280 Së pari, duke supozuar që përdoruesit zakonisht nuk shkruani vargjet aq gjatë, 145 00:09:05,280 --> 00:09:07,610 ju mund të humbim një shumë të kujtesës. 146 00:09:07,610 --> 00:09:10,530 Në makinat moderne, kjo nuk mund të jetë një çështje, nëse ju bëni këtë 147 00:09:10,530 --> 00:09:13,890 në një ose dy raste të izoluara, 148 00:09:13,890 --> 00:09:17,630 por në qoftë se ju jeni duke marrë të dhëna përdoruesi në një lak dhe ruajtjen për përdorim të mëvonshëm, 149 00:09:17,630 --> 00:09:20,870 ju mund të shpejt thith deri një ton të kujtesës. 150 00:09:20,870 --> 00:09:24,450 Përveç kësaj, në qoftë se ju jeni me shkrim programi është për një kompjuter më të vogël - 151 00:09:24,450 --> 00:09:28,100 një pajisje si një smartphone apo diçka tjetër me kujtesë të kufizuar - 152 00:09:28,100 --> 00:09:32,060 kjo zgjidhje do të shkaktojë probleme shumë më të shpejtë. 153 00:09:32,060 --> 00:09:36,450 E dyta, arsyeja më serioz që të mos e bëjnë këtë është se ajo lë programin tuaj të pambrojtur 154 00:09:36,450 --> 00:09:39,710 në atë që quhet një tampon del nga shtrati sulm. 155 00:09:39,710 --> 00:09:45,840 Në programimin, një tampon është memorie përdoret për të ruajtur përkohësisht të dhëna ose të prodhimit të dhënave, 156 00:09:45,840 --> 00:09:48,980 e cila në këtë rast është bllok 1000-char tonë. 157 00:09:48,980 --> 00:09:53,370 Një tampon del nga shtrati ndodh kur të dhënat është shkruar kaluara në fund të bllokut. 158 00:09:53,370 --> 00:09:57,790 >> Për shembull, në qoftë se një përdorues të vërtetë e bën lloji në më shumë se 1000 karaktere. 159 00:09:57,790 --> 00:10:01,570 Ju mund të keni përjetuar këtë aksidentalisht kur programimit me vargjeve. 160 00:10:01,570 --> 00:10:05,620 Nëse ju keni një koleksion prej 10 ints, asgjë nuk ju ndalon të duke u përpjekur për të lexuar ose shkruar 161 00:10:05,620 --> 00:10:07,810 int 15. 162 00:10:07,810 --> 00:10:10,000 Nuk ka paralajmërime ose përpiluesit gabime. 163 00:10:10,000 --> 00:10:13,250 Programi vetëm gabimet drejt përpara dhe accesses kujtesës 164 00:10:13,250 --> 00:10:18,150 ku ajo mendon se do të jetë int 15, dhe kjo mund të prishësh variablave tuaja të tjera. 165 00:10:18,150 --> 00:10:22,040 Në rastin më të keq, ju mund të prishësh disa brendshëm programit tuaj 166 00:10:22,040 --> 00:10:26,820 mekanizmat e kontrollit, duke shkaktuar programin tuaj të vërtetë të ekzekutojë udhëzimet ndryshme 167 00:10:26,820 --> 00:10:28,340 se ju qëllim. 168 00:10:28,340 --> 00:10:31,360 >> Tani, kjo nuk është e zakonshme për të bërë këtë aksidentalisht, 169 00:10:31,360 --> 00:10:35,150 por kjo është një teknikë mjaft e zakonshme që liq përdorni për të thyer programe 170 00:10:35,150 --> 00:10:39,080 dhe të vënë të dëmshme në kompjuterë të njerëzve të tjerë. 171 00:10:39,080 --> 00:10:42,910 Prandaj, ne nuk mund të përdorni vetëm zgjidhje tonë naiv. 172 00:10:42,910 --> 00:10:45,590 Ne kemi nevojë për një mënyrë për të parandaluar programet tona nga të qenit të pambrojtur 173 00:10:45,590 --> 00:10:47,880 për një sulm del nga shtrati tampon. 174 00:10:47,880 --> 00:10:51,430 Për ta bërë këtë, ne duhet të sigurohemi që tampon tonë mund të rritet si lexojmë 175 00:10:51,430 --> 00:10:53,850 input më shumë nga përdoruesit. 176 00:10:53,850 --> 00:10:57,440 Zgjidhje? Ne përdorim një tampon ndarë tog. 177 00:10:57,440 --> 00:10:59,950 Që ne mund të ndrysho atë duke përdorur Resize funksionin realloc, 178 00:10:59,950 --> 00:11:04,580 dhe ne të mbajtur gjurmët e dy numrave - indeksi i ardhshëm slot bosh në tampon 179 00:11:04,580 --> 00:11:08,390 dhe gjatësia ose kapaciteti i tampon. 180 00:11:08,390 --> 00:11:13,210 Ne lexojmë në karaktere nga përdoruesit në një kohë duke përdorur funksionin fgetc. 181 00:11:13,210 --> 00:11:19,360 Argumenti funksioni fgetc merr - STDIN - është një referencë për vargun standarde input, 182 00:11:19,360 --> 00:11:23,810 cila është një kanal preconnected input se është përdorur për të transferuar futjen e përdoruesit 183 00:11:23,810 --> 00:11:26,270 nga terminali tek programit. 184 00:11:26,270 --> 00:11:29,890 >> Kurdo që përdoruesi lloje në një karakter të ri, ne kontrolloni për të parë nëse indeksi 185 00:11:29,890 --> 00:11:35,810 e çarë e ardhshëm të lirë plus 1 është më i madh se kapaciteti i buffer. 186 00:11:35,810 --> 00:11:39,690 The +1 vjen në, sepse në qoftë se indeksi i ardhshëm lirë është 5, 187 00:11:39,690 --> 00:11:44,150 atëherë gjatësia Buffer sonë duhet të jetë 6 falë 0 indeksimit. 188 00:11:44,150 --> 00:11:48,350 Në qoftë se ne kemi të drejtuar nga hapësira në tampon, atëherë ne përpjekje për të resize atë, 189 00:11:48,350 --> 00:11:51,690 dyfishuar atë mënyrë që ne të shkurtuar në numrin e herë që ne resize 190 00:11:51,690 --> 00:11:54,760 në qoftë se përdoruesi është shtypur në një varg të gjatë me të vërtetë. 191 00:11:54,760 --> 00:11:57,950 Nëse vargu ka marrë shumë kohë ose në qoftë se ne të drejtuar nga e kujtesës tog me ta, 192 00:11:57,950 --> 00:12:01,350 ne liruar tampon tonë dhe NULL kthimit. 193 00:12:01,350 --> 00:12:04,170 >> Së fundi, ne append char në tampon. 194 00:12:04,170 --> 00:12:08,200 Pasi hitet përdorues të hyjë ose të kthehen, duke sinjalizuar një linjë të re, 195 00:12:08,200 --> 00:12:12,050 ose speciale char - kontrollit d - i cili sinjalizon një fund të kontributit, 196 00:12:12,050 --> 00:12:16,240 ne bëjmë një kontroll për të parë në qoftë se përdoruesi shtypur në të vërtetë në asgjë në të gjitha. 197 00:12:16,240 --> 00:12:18,820 Nëse jo, do të kthehemi null. 198 00:12:18,820 --> 00:12:22,280 Përndryshe, sepse tampon tonë është ndoshta më e madhe se ne kemi nevojë, 199 00:12:22,280 --> 00:12:24,830 në rastin më të keq është pothuajse dy herë më i madh sa ne kemi nevojë 200 00:12:24,830 --> 00:12:27,830 pasi ne çdo herë kemi dyfishtë resize, 201 00:12:27,830 --> 00:12:31,840 kemi bërë një kopje të re të vargut duke përdorur vetëm sasi e hapësirës që ne kemi nevojë. 202 00:12:31,840 --> 00:12:34,220 Ne shtoni një shtesë 1 të thirrjes malloc, 203 00:12:34,220 --> 00:12:37,810 kështu që nuk ka hapësirë ​​për karakterin e veçantë null terminator - e \ 0, 204 00:12:37,810 --> 00:12:41,990 të cilat ne append në vargun dikur ne kopje në pjesën tjetër të karaktereve, 205 00:12:41,990 --> 00:12:45,060 strncpy përdorur në vend të strcpy 206 00:12:45,060 --> 00:12:48,830 kështu që ne mund të përcaktojë saktësisht se sa chars ne duam të kopje. 207 00:12:48,830 --> 00:12:51,690 Strcpy kopjon deri sa ajo godet një \ 0. 208 00:12:51,690 --> 00:12:55,740 Pastaj ne liruar tampon tonë dhe kthehen kopje të thirrësit. 209 00:12:55,740 --> 00:12:59,840 >> Kush e dinte tillë thjeshtë në dukje funksioni mund të jetë i komplikuar kështu? 210 00:12:59,840 --> 00:13:02,820 Tani ju e dini se çfarë shkon në bibliotekë CS50. 211 00:13:02,820 --> 00:13:06,470 >> Emri im është Nate Hardison, dhe kjo është CS50. 212 00:13:06,470 --> 00:13:08,350 [CS50.TV]