1 00:00:00,000 --> 00:00:02,490 [Powered by Google Translate] [CS50 Maktaba] 2 00:00:02,490 --> 00:00:04,220 [Nate Hardison] [Chuo Kikuu cha Harvard] 3 00:00:04,220 --> 00:00:07,260 [Hii ni CS50. CS50.TV] 4 00:00:07,260 --> 00:00:11,510 Maktaba CS50 ni chombo inasaidia kwamba sisi kuwa imewekwa juu ya appliance 5 00:00:11,510 --> 00:00:15,870 ili iwe rahisi kwa wewe kuandika mipango ya haraka kwa watumiaji wa pembejeo. 6 00:00:15,870 --> 00:00:21,670 Katika video hii, tutaweza kuvuta nyuma ya pazia na kuangalia nini hasa ni katika maktaba CS50. 7 00:00:21,670 --> 00:00:25,520 >> Katika video ya maktaba C, sisi majadiliano kuhusu jinsi wewe ni pamoja na files # headers 8 00:00:25,520 --> 00:00:27,570 ya maktaba katika chanzo code yako, 9 00:00:27,570 --> 00:00:31,150 na kisha wewe zilizounganishwa na faili binary maktaba wakati wa awamu ya kuunganisha 10 00:00:31,150 --> 00:00:33,140 ya mchakato wa kutungwa. 11 00:00:33,140 --> 00:00:36,440 files header bayana interface ya maktaba. 12 00:00:36,440 --> 00:00:41,280 Hiyo ni, wao undani yote ya rasilimali kwamba maktaba ina inapatikana kwa wewe kutumia, 13 00:00:41,280 --> 00:00:45,250 kama kazi maazimio, constants, na aina ya data. 14 00:00:45,250 --> 00:00:48,890 binary maktaba faili ina utekelezaji wa maktaba, 15 00:00:48,890 --> 00:00:54,580 ambayo ni compiled kutoka files maktaba header na wa maktaba. c chanzo code files. 16 00:00:54,580 --> 00:00:59,820 >> binary maktaba faili si ya kuvutia sana kuangalia tangu ni vizuri, katika binary. 17 00:00:59,820 --> 00:01:03,300 Kwa hivyo, hebu tuangalie files header kwa ajili ya maktaba badala yake. 18 00:01:03,300 --> 00:01:07,710 Katika kesi hiyo, kuna moja tu header faili inayoitwa cs50.h. 19 00:01:07,710 --> 00:01:11,040 Tumekuwa imewekwa katika user ni pamoja saraka 20 00:01:11,040 --> 00:01:15,150 pamoja na header mengine mfumo maktaba 'files. 21 00:01:15,150 --> 00:01:21,530 >> Moja ya mambo ya kwanza utasikia taarifa ni kwamba cs50.h # inajumuisha faili header kutoka maktaba nyingine - 22 00:01:21,530 --> 00:01:25,670 kuelea, mipaka, kiwango bool, na lib standard. 23 00:01:25,670 --> 00:01:28,800 Tena, kufuatia kanuni ya si reinventing gurudumu, 24 00:01:28,800 --> 00:01:33,490 tumekuwa kujengwa maktaba CS0 kutumia zana nyingine zinazotolewa kwa ajili yetu. 25 00:01:33,490 --> 00:01:38,690 >> Jambo la pili utaona katika maktaba ni kwamba sisi kufafanua aina mpya inayoitwa "kamba." 26 00:01:38,690 --> 00:01:42,330 Mstari huu kweli tu inajenga pak kwa ajili ya aina Char *, 27 00:01:42,330 --> 00:01:46,000 hivyo hana magically imbue mpya string aina na sifa 28 00:01:46,000 --> 00:01:49,650 huhusishwa na vitu string katika lugha nyingine, 29 00:01:49,650 --> 00:01:50,850 kama vile urefu. 30 00:01:50,850 --> 00:01:55,180 sababu tumefanya hii ni ngao programmers mpya kutoka maelezo gory 31 00:01:55,180 --> 00:01:57,580 ya kuyatumia mpaka wao uko tayari. 32 00:01:57,580 --> 00:02:00,130 >> sehemu ya pili ya faili header ni tangazo la kazi 33 00:02:00,130 --> 00:02:04,410 kwamba maktaba CS50 hutoa pamoja na nyaraka. 34 00:02:04,410 --> 00:02:06,940 Angalia kiwango cha zaidi katika maoni hapa. 35 00:02:06,940 --> 00:02:10,560 Hii ni super muhimu ili watu kujua jinsi ya kutumia kazi hizi. 36 00:02:10,560 --> 00:02:19,150 Tunatangaza, kwa upande wake, kazi kwa haraka na mtumiaji chars kurudi DOUBLES, ikifungwa, ints, 37 00:02:19,150 --> 00:02:24,160 muda mrefu hutamani, na masharti, kwa kutumia kamba yetu wenyewe aina. 38 00:02:24,160 --> 00:02:26,260 Kufuatia kanuni ya mafichoni habari, 39 00:02:26,260 --> 00:02:31,640 sisi kuweka ufafanuzi wetu katika faili tofauti c utekelezaji -. cs50.c-- 40 00:02:31,640 --> 00:02:35,110 iko katika saraka chanzo mtumiaji. 41 00:02:35,110 --> 00:02:38,040 Tumekuwa zinazotolewa kwamba faili ili uweze kuangalia ni, 42 00:02:38,040 --> 00:02:41,490 kujifunza kutoka hayo, na recompile kwenye mashine mbalimbali kama unataka, 43 00:02:41,490 --> 00:02:45,510 ingawa sisi nadhani ni bora kufanya kazi katika appliance darasa hili. 44 00:02:45,510 --> 00:02:47,580 Anyway, hebu kuangalia ni sasa. 45 00:02:49,020 --> 00:02:54,620 >> kazi GetChar, GetDouble, GetFloat, GetInt, na GetLongLong 46 00:02:54,620 --> 00:02:58,160 wote umejengwa juu ya kazi GetString. 47 00:02:58,160 --> 00:03:01,510 Ni zinageuka kuwa wao wote kufuata kimsingi mfano huo. 48 00:03:01,510 --> 00:03:04,870 Wao kutumia kitanzi wakati kuchochea mtumiaji kwa mstari mmoja wa pembejeo. 49 00:03:04,870 --> 00:03:08,430 Wao hurudi thamani maalum kama mtumiaji pembejeo line tupu. 50 00:03:08,430 --> 00:03:11,750 Wao kujaribu kuchanganua pembejeo mtumiaji kama aina sahihi, 51 00:03:11,750 --> 00:03:15,010 iwe Char, mbili, kuelea, nk 52 00:03:15,010 --> 00:03:18,710 Na kisha kurudi ama matokeo kama pembejeo mara kwa mafanikio parsed 53 00:03:18,710 --> 00:03:21,330 au wao reprompt mtumiaji. 54 00:03:21,330 --> 00:03:24,230 >> Katika ngazi ya juu, kuna kitu kweli Tricky hapa. 55 00:03:24,230 --> 00:03:28,760 Unaweza kuwa imeandikwa vile vile muundo code mwenyewe katika siku za nyuma. 56 00:03:28,760 --> 00:03:34,720 Pengine sehemu ya cryptic-kuangalia ni wito sscanf kwamba parses pembejeo mtumiaji. 57 00:03:34,720 --> 00:03:38,160 Sscanf ni sehemu ya familia pembejeo format uongofu. 58 00:03:38,160 --> 00:03:42,300 Ni maisha katika io.h kiwango, na kazi yake ni kuchanganua string C, 59 00:03:42,300 --> 00:03:46,520 kulingana na muundo fulani, hifadhi matokeo Hazrat katika variable 60 00:03:46,520 --> 00:03:48,720 zinazotolewa na mpigaji. 61 00:03:48,720 --> 00:03:53,570 Tangu format pembejeo uongofu kazi ni muhimu sana, sana kutumika kazi 62 00:03:53,570 --> 00:03:56,160 ambayo si super Intuitive mara ya kwanza, 63 00:03:56,160 --> 00:03:58,300 tutaweza kwenda juu ya jinsi sscanf kazi. 64 00:03:58,300 --> 00:04:03,330 >> Hoja ya kwanza ni sscanf * char - pointer tabia. 65 00:04:03,330 --> 00:04:05,150 Kwa kazi ya kufanya kazi vizuri, 66 00:04:05,150 --> 00:04:08,340 tabia kwamba wanapaswa kuwa tabia ya kwanza ya string C, 67 00:04:08,340 --> 00:04:12,270 terminated na tabia null \ 0. 68 00:04:12,270 --> 00:04:15,120 Hii ni string kuchanganua 69 00:04:15,120 --> 00:04:18,269 Hoja ya pili ni sscanf string format, 70 00:04:18,269 --> 00:04:20,839 kawaida kupita katika mara kwa mara kama kamba, 71 00:04:20,839 --> 00:04:24,040 na wewe aliyoiona string kama hii kabla ya wakati wa kutumia printf. 72 00:04:24,040 --> 00:04:28,650 ishara asilimia katika string format inaonyesha specifier uongofu. 73 00:04:28,650 --> 00:04:30,850 tabia mara moja kufuatia ishara asilimia, 74 00:04:30,850 --> 00:04:35,430 inaonyesha aina C kwamba tunataka sscanf kubadilisha na. 75 00:04:35,430 --> 00:04:40,090 Katika GetInt, unaweza kuona kwamba kuna d% na c%. 76 00:04:40,090 --> 00:04:48,690 Hii ina maana kwamba sscanf watajaribu int decimal - d% - na char - c%. 77 00:04:48,690 --> 00:04:51,510 Kwa kila specifier uongofu katika string format, 78 00:04:51,510 --> 00:04:56,620 sscanf anatarajia hoja sambamba baadaye katika hoja orodha yake. 79 00:04:56,620 --> 00:05:00,850 Hoja hiyo ya lazima uhakika na mahali ipasavyo typed 80 00:05:00,850 --> 00:05:04,000 ambayo kuhifadhi matokeo ya uongofu. 81 00:05:04,000 --> 00:05:08,910 >> njia ya kawaida ya kufanya hii ni kujenga juu ya kutofautiana stack kabla wito sscanf 82 00:05:08,910 --> 00:05:11,440 kwa kila bidhaa kwamba unataka kuchanganua kutoka string 83 00:05:11,440 --> 00:05:15,520 na kisha kutumia operator anwani - ampersand - kupita kuyatumia 84 00:05:15,520 --> 00:05:19,100 kwa wale vigezo wito sscanf. 85 00:05:19,100 --> 00:05:22,720 Unaweza kuona kwamba katika GetInt sisi kufanya hasa hili. 86 00:05:22,720 --> 00:05:28,240 Haki kabla ya wito sscanf, sisi kutangaza int kuitwa n na Char c wanamwomba stack, 87 00:05:28,240 --> 00:05:32,340 na sisi kupita kuyatumia na kuwatia katika wito sscanf. 88 00:05:32,340 --> 00:05:35,800 Kuweka vigezo haya juu ya stack inapendelewa zaidi kutumia nafasi zilizotengwa 89 00:05:35,800 --> 00:05:39,350 juu ya lundo na malloc, tangu wewe kuepuka Rudia ya wito malloc, 90 00:05:39,350 --> 00:05:43,060 na huna na wasiwasi kuhusu kinachovuja kumbukumbu. 91 00:05:43,060 --> 00:05:47,280 Nyingine si prefixed kwa ishara ya asilimia si kuchochea uongofu. 92 00:05:47,280 --> 00:05:50,380 Badala yake wao tu kuongeza vipimo format. 93 00:05:50,380 --> 00:05:56,500 >> Kwa mfano, kama string format katika GetInt walikuwa d% badala yake, 94 00:05:56,500 --> 00:05:59,800 sscanf bila kuangalia kwa barua ikifuatiwa na int, 95 00:05:59,800 --> 00:06:04,360 na wakati itakuwa jaribio kubadilisha int, itakuwa si kufanya kitu kingine chochote kwa a. 96 00:06:04,360 --> 00:06:07,440 isipokuwa tu kwa hii ni whitespace. 97 00:06:07,440 --> 00:06:11,030 White nafasi wahusika katika string format mechi yoyote ya kiasi cha whitespace - 98 00:06:11,030 --> 00:06:12,890 hata hakuna kabisa. 99 00:06:12,890 --> 00:06:18,100 Hivyo, hiyo ndiyo maoni inataja uwezekano kwa kuongoza na / au trailing whitespace. 100 00:06:18,100 --> 00:06:22,910 Hivyo, katika hatua hii inaonekana kama sscanf wito wetu kujaribu kuchanganua pembejeo mtumiaji string 101 00:06:22,910 --> 00:06:25,380 kwa kuangalia kwa whitespace iwezekanavyo kuongoza, 102 00:06:25,380 --> 00:06:29,300 ikifuatiwa na int kwamba itabadilishwa na kuhifadhiwa katika int variable n 103 00:06:29,300 --> 00:06:33,090 ikifuatiwa na baadhi ya kiasi cha whitespace, na kufuatiwa na tabia 104 00:06:33,090 --> 00:06:35,810 kuhifadhiwa katika c Char kutofautiana. 105 00:06:35,810 --> 00:06:37,790 >> Je kuhusu thamani ya kurudi? 106 00:06:37,790 --> 00:06:41,560 Sscanf itakuwa Hazrat line pembejeo kutoka mwanzo hadi mwisho, 107 00:06:41,560 --> 00:06:44,860 kuacha wakati unafikia mwisho au wakati tabia katika pembejeo 108 00:06:44,860 --> 00:06:49,320 hailingani na tabia format au wakati hawezi kufanya uongofu. 109 00:06:49,320 --> 00:06:52,690 Kurudi thamani yake ni kutumika kwa moja wakati ni kusimamishwa. 110 00:06:52,690 --> 00:06:55,670 Kama ni kusimamishwa, kwa sababu ni kufikiwa mwisho wa kamba pembejeo 111 00:06:55,670 --> 00:07:00,630 kabla ya kufanya wongofu yoyote na kabla ya kushindwa mechi sehemu ya kamba format, 112 00:07:00,630 --> 00:07:04,840 kisha maalum EOF mara kwa mara ni kurudi. 113 00:07:04,840 --> 00:07:08,200 Vinginevyo, ni anarudi idadi ya wongofu mafanikio, 114 00:07:08,200 --> 00:07:14,380 ambayo inaweza kuwa 0, 1, au 2, tangu tumekuwa aliuliza kwa wongofu mbili. 115 00:07:14,380 --> 00:07:19,000 Katika kesi yetu, tunataka kuhakikisha kwamba mtumiaji typed katika int na tu int. 116 00:07:19,000 --> 00:07:23,370 >> Hivyo, tunataka sscanf kurudi 1. Angalia kwa nini? 117 00:07:23,370 --> 00:07:26,850 Kama sscanf akarudi 0, basi hakuna wongofu yalifanywa, 118 00:07:26,850 --> 00:07:31,690 hivyo user typed kitu kingine zaidi ya int katika mwanzo wa pembejeo. 119 00:07:31,690 --> 00:07:37,100 Kama sscanf anarudi 2, basi mtumiaji hawakuwa vizuri unapoandika katika wakati wa mwanzo wa pembejeo, 120 00:07:37,100 --> 00:07:41,390 lakini wao kisha typed katika baadhi ya tabia zisizo whitespace baadaye 121 00:07:41,390 --> 00:07:44,940 tangu% c uongofu imefanikiwa. 122 00:07:44,940 --> 00:07:49,570 Wow, kwamba ni kabisa maelezo marefu kwa moja wito kazi. 123 00:07:49,570 --> 00:07:53,460 Anyway, kama unataka taarifa zaidi juu ya sscanf na ndugu zake, 124 00:07:53,460 --> 00:07:57,130 angalia kurasa mtu, Google, au wote wawili. 125 00:07:57,130 --> 00:07:58,780 Kuna kura ya chaguzi string format, 126 00:07:58,780 --> 00:08:03,830 na hizi zinaweza kuokoa mengi ya kazi za mikono wakati akijaribu Hazrat masharti katika C. 127 00:08:03,830 --> 00:08:07,180 >> kazi ya mwisho katika maktaba ya kuangalia ni GetString. 128 00:08:07,180 --> 00:08:10,310 Ni zinageuka kuwa GetString ni kazi gumu kuandika vizuri, 129 00:08:10,310 --> 00:08:14,290 ingawa inaonekana kama kazi hiyo rahisi, ya kawaida. 130 00:08:14,290 --> 00:08:16,170 Kwa nini hii ni kesi? 131 00:08:16,170 --> 00:08:21,380 Naam, hebu fikiria jinsi sisi ni kwenda kuhifadhi mstari kwamba mtumiaji aina in 132 00:08:21,380 --> 00:08:23,880 Tangu string ni mlolongo wa chars, 133 00:08:23,880 --> 00:08:26,430 sisi kutaka kuhifadhi katika safu juu ya stack, 134 00:08:26,430 --> 00:08:31,250 lakini tunataka haja ya kujua jinsi ya muda mrefu safu ni kwenda kuwa wakati sisi kuyatangaza. 135 00:08:31,250 --> 00:08:34,030 Aidha, kama tunataka kuweka kwenye chungu, 136 00:08:34,030 --> 00:08:38,090 sisi haja ya kupita kwa malloc idadi ya ka tunataka hifadhi, 137 00:08:38,090 --> 00:08:39,730 lakini hii ni vigumu. 138 00:08:39,730 --> 00:08:42,760 Sisi hatuna wazo jinsi wengi chars mtumiaji aina katika 139 00:08:42,760 --> 00:08:46,590 kabla ya mtumiaji kweli haina aina yao. 140 00:08:46,590 --> 00:08:50,720 >> ufumbuzi naive tatizo hili ni kubwa tu ya kuwaweka chunk wa nafasi, kusema, 141 00:08:50,720 --> 00:08:54,540 block ya chars 1000 kwa ajili ya pembejeo ya mtumiaji, 142 00:08:54,540 --> 00:08:57,980 kuchukua kwamba mtumiaji kamwe aina katika string kwamba kwa muda mrefu. 143 00:08:57,980 --> 00:09:00,810 Hii ni wazo mbaya kwa sababu mbili. 144 00:09:00,810 --> 00:09:05,280 Kwanza, kuchukua kwamba watumiaji kawaida hawana aina katika masharti kwamba kwa muda mrefu, 145 00:09:05,280 --> 00:09:07,610 unaweza kupoteza mengi ya kumbukumbu. 146 00:09:07,610 --> 00:09:10,530 Kwenye mashine ya kisasa, hii inaweza kuwa suala kama kufanya hivyo 147 00:09:10,530 --> 00:09:13,890 katika moja au mbili mara moja pekee, 148 00:09:13,890 --> 00:09:17,630 lakini kama wewe ni kuchukua pembejeo mtumiaji katika kitanzi na kuhifadhi kwa matumizi ya baadaye, 149 00:09:17,630 --> 00:09:20,870 unaweza haraka nwa tani ya kumbukumbu. 150 00:09:20,870 --> 00:09:24,450 Zaidi ya hayo, ikiwa mpango wewe ni kuandika ni kwa ajili ya kompyuta ndogo ndogo - 151 00:09:24,450 --> 00:09:28,100 kifaa kama smartphone au kitu kingine na kumbukumbu mdogo - 152 00:09:28,100 --> 00:09:32,060 ufumbuzi hii kusababisha matatizo mengi kwa kasi zaidi. 153 00:09:32,060 --> 00:09:36,450 pili, mbaya zaidi sababu si kufanya hii ni kwamba majani ya mpango wako hatarini 154 00:09:36,450 --> 00:09:39,710 kwa nini inaitwa kufurika buffer mashambulizi. 155 00:09:39,710 --> 00:09:45,840 Katika programu, buffer ni kumbukumbu kutumika kwa muda kuhifadhi data pembejeo au pato, 156 00:09:45,840 --> 00:09:48,980 ambayo katika kesi hii ni yetu 1000-char block. 157 00:09:48,980 --> 00:09:53,370 kufurika buffer hutokea wakati data imeandikwa zamani mwisho ya kuzuia. 158 00:09:53,370 --> 00:09:57,790 >> Kwa mfano, kama mtumiaji kweli haina aina katika chars zaidi ya 1000. 159 00:09:57,790 --> 00:10:01,570 Unaweza kuwa uzoefu huu wakati ajali na programu arrays. 160 00:10:01,570 --> 00:10:05,620 Kama una safu ya ints 10, ataacha kitu kutoka kujaribu kusoma wala kuandika 161 00:10:05,620 --> 00:10:07,810 Int 15. 162 00:10:07,810 --> 00:10:10,000 Kuna maonyo compiler hakuna au makosa. 163 00:10:10,000 --> 00:10:13,250 mpango tu blunders sawa mbele na grossistledet kumbukumbu 164 00:10:13,250 --> 00:10:18,150 ambapo inafikiri int 15 itakuwa, na hii inaweza overwrite yako vigezo vingine. 165 00:10:18,150 --> 00:10:22,040 Katika kesi mbaya zaidi, unaweza overwrite baadhi ya ndani ya mpango wako 166 00:10:22,040 --> 00:10:26,820 kudhibiti taratibu, na kusababisha mpango wako kwa kweli nitafanya maelekezo mbalimbali 167 00:10:26,820 --> 00:10:28,340 kuliko wewe lengo. 168 00:10:28,340 --> 00:10:31,360 >> Sasa, ni si kawaida kufanya hili ajali, 169 00:10:31,360 --> 00:10:35,150 lakini hii ni mbinu ya haki ya kawaida kwamba watu wabaya kutumia kuvunja mipango 170 00:10:35,150 --> 00:10:39,080 na kuweka malicious code kwenye kompyuta ya watu wengine. 171 00:10:39,080 --> 00:10:42,910 Kwa hiyo, hatuwezi tu kutumia ufumbuzi yetu naive. 172 00:10:42,910 --> 00:10:45,590 Tunahitaji njia ya kuzuia mipango yetu kutoka kuwa katika mazingira magumu 173 00:10:45,590 --> 00:10:47,880 kwa mashambulizi buffer kufurika. 174 00:10:47,880 --> 00:10:51,430 Ili kufanya hivyo, tunahitaji kuhakikisha kuwa buffer yetu inaweza kukua kama sisi kusoma 175 00:10:51,430 --> 00:10:53,850 zaidi pembejeo kutoka kwa mtumiaji. 176 00:10:53,850 --> 00:10:57,440 suluhisho? Sisi kutumia zilizotengwa lundo buffer. 177 00:10:57,440 --> 00:10:59,950 Tangu tunaweza resize hilo kutumia resize kazi realloc, 178 00:10:59,950 --> 00:11:04,580 na sisi kuweka wimbo wa namba mbili - index ya yanayopangwa ijayo tupu katika buffer 179 00:11:04,580 --> 00:11:08,390 na urefu au uwezo wa buffer. 180 00:11:08,390 --> 00:11:13,210 Tunasoma katika chars kutoka kwa mtumiaji mmoja wakati kutumia kazi fgetc. 181 00:11:13,210 --> 00:11:19,360 Hoja kazi fgetc inachukua - stdin - ni kumbukumbu ya string kiwango pembejeo, 182 00:11:19,360 --> 00:11:23,810 ambayo ni preconnected pembejeo channel ambayo hutumiwa kwa kuhamisha pembejeo mtumiaji 183 00:11:23,810 --> 00:11:26,270 kutoka terminal kwa mpango. 184 00:11:26,270 --> 00:11:29,890 >> Kila mara mtumiaji aina katika tabia mpya, sisi kuangalia kuona kama index 185 00:11:29,890 --> 00:11:35,810 ya yanayopangwa ijayo bure plus 1, ni mkubwa kuliko uwezo wa buffer. 186 00:11:35,810 --> 00:11:39,690 1 huja katika sababu kama ijayo index bure ni 5, 187 00:11:39,690 --> 00:11:44,150 kisha urefu buffer wetu lazima 6 shukrani kwa Indexing 0. 188 00:11:44,150 --> 00:11:48,350 Kama tumekuwa kukimbia nje ya nafasi katika buffer, basi sisi kujaribu resize yake, 189 00:11:48,350 --> 00:11:51,690 kutaka kuongezwa ili sisi kupunguza idadi ya nyakati kwamba sisi resize 190 00:11:51,690 --> 00:11:54,760 kama mtumiaji ni kuandika katika string kweli kwa muda mrefu. 191 00:11:54,760 --> 00:11:57,950 Kama string imenipatia muda mrefu sana au kama sisi kukimbia nje ya kumbukumbu chungu, 192 00:11:57,950 --> 00:12:01,350 sisi huru buffer yetu na kurudi null. 193 00:12:01,350 --> 00:12:04,170 >> Hatimaye, sisi ambatisha Char kwa buffer. 194 00:12:04,170 --> 00:12:08,200 Mara hits mtumiaji kuingia au kurudi kumuashiria line mpya, 195 00:12:08,200 --> 00:12:12,050 au maalum char - kudhibiti d - ambayo ishara ya mwisho wa pembejeo, 196 00:12:12,050 --> 00:12:16,240 sisi kufanya kuangalia ili kuona kama kweli mtumiaji typed katika chochote wakati wote. 197 00:12:16,240 --> 00:12:18,820 Kama siyo, sisi kurudi null. 198 00:12:18,820 --> 00:12:22,280 Vinginevyo, kwa sababu buffer yetu pengine ni kubwa kuliko sisi haja, 199 00:12:22,280 --> 00:12:24,830 katika hali mbaya ni kama mara mbili kubwa kama tunahitaji 200 00:12:24,830 --> 00:12:27,830 tangu sisi mara mbili kila wakati sisi resize, 201 00:12:27,830 --> 00:12:31,840 sisi kufanya nakala mpya wa kamba kwa kutumia tu ya kiasi cha nafasi ya kuwa tunahitaji. 202 00:12:31,840 --> 00:12:34,220 Sisi kuongeza 1 ziada wito malloc, 203 00:12:34,220 --> 00:12:37,810 hivyo kwamba kuna nafasi kwa ajili ya tabia maalum null Terminator - \ 0, 204 00:12:37,810 --> 00:12:41,990 ambayo sisi ambatisha kwa kamba mara moja sisi nakala katika mapumziko ya wahusika, 205 00:12:41,990 --> 00:12:45,060 kutumia strncpy badala ya strcpy 206 00:12:45,060 --> 00:12:48,830 ili tuweze kubainisha hasa jinsi wengi chars tunataka nakala. 207 00:12:48,830 --> 00:12:51,690 Strcpy nakala mpaka hits \ 0. 208 00:12:51,690 --> 00:12:55,740 Kisha sisi huru buffer yetu na kurudi nakala kwa mpigaji. 209 00:12:55,740 --> 00:12:59,840 >> Nani alijua kazi vile rahisi-Wanajidai inaweza ngumu hivyo? 210 00:12:59,840 --> 00:13:02,820 Sasa unajua yale yanayoendelea ndani ya maktaba CS50. 211 00:13:02,820 --> 00:13:06,470 >> Jina langu ni Nate Hardison, na hii ni CS50. 212 00:13:06,470 --> 00:13:08,350 [CS50.TV]