1 00:00:00,000 --> 00:00:02,490 [Powered by Google Translate] [CS50 Llyfrgell] 2 00:00:02,490 --> 00:00:04,220 [Nate Hardison] [Harvard University] 3 00:00:04,220 --> 00:00:07,260 [Mae hyn yn CS50. CS50.TV] 4 00:00:07,260 --> 00:00:11,510 Mae'r llyfrgell CS50 yn offeryn buddiol yr ydym wedi'u gosod ar y peiriant 5 00:00:11,510 --> 00:00:15,870 i'w gwneud yn haws i chi i ysgrifennu rhaglenni bod defnyddwyr yn brydlon ar gyfer mewnbwn. 6 00:00:15,870 --> 00:00:21,670 Yn y fideo, byddwn yn tynnu yn ôl y llenni ac edrych ar beth yn union sydd yn y llyfrgell CS50. 7 00:00:21,670 --> 00:00:25,520 >> Yn y fideo ar lyfrgelloedd C, rydym yn siarad am sut yr ydych # cynnwys ffeiliau penawdau 8 00:00:25,520 --> 00:00:27,570 y llyfrgell yn eich cod ffynhonnell, 9 00:00:27,570 --> 00:00:31,150 ac yna rydych yn cysylltu gyda ffeil ddeuaidd llyfrgell yn ystod y cyfnod cysylltu 10 00:00:31,150 --> 00:00:33,140 o'r broses casglu. 11 00:00:33,140 --> 00:00:36,440 Mae'r ffeiliau pennawd yn nodi y rhyngwyneb y llyfrgell. 12 00:00:36,440 --> 00:00:41,280 Hynny yw, maent yn manylu ar yr holl o'r adnoddau sydd gan y llyfrgell ar gael i chi eu defnyddio, 13 00:00:41,280 --> 00:00:45,250 fel datganiadau swyddogaeth, cysonion, a mathau o ddata. 14 00:00:45,250 --> 00:00:48,890 Mae'r ffeil ddeuaidd llyfrgell yn cynnwys gweithrediad y llyfrgell, 15 00:00:48,890 --> 00:00:54,580 sy'n cael ei lunio o ffeiliau pennawd y llyfrgell a'r llyfrgell. c ffeiliau cod ffynhonnell. 16 00:00:54,580 --> 00:00:59,820 >> Nid yw'r ffeil ddeuaidd llyfrgell yn ddiddorol iawn i edrych ar gan ei fod yn, wel, yn deuaidd. 17 00:00:59,820 --> 00:01:03,300 Felly, gadewch i ni edrych ar y ffeiliau pennawd ar gyfer y llyfrgell yn lle hynny. 18 00:01:03,300 --> 00:01:07,710 Yn yr achos hwn, dim ond un ffeil pennawd enw cs50.h. 19 00:01:07,710 --> 00:01:11,040 Rydym wedi gosod yn y cyfeiriadur defnyddiwr yn cynnwys 20 00:01:11,040 --> 00:01:15,150 ynghyd â ffeiliau pennawd llyfrgelloedd system arall '. 21 00:01:15,150 --> 00:01:21,530 >> Un o'r pethau cyntaf y byddwch yn sylwi arno yw fod cs50.h # yn cynnwys ffeiliau pennawd o lyfrgelloedd eraill - 22 00:01:21,530 --> 00:01:25,670 arnofio, terfynau, safon bool, a lib safonol. 23 00:01:25,670 --> 00:01:28,800 Unwaith eto, yn dilyn yr egwyddor o beidio â ailddyfeisio'r olwyn, 24 00:01:28,800 --> 00:01:33,490 rydym wedi adeiladu y llyfrgell CS0 defnyddio offer sy'n eraill a ddarperir i ni. 25 00:01:33,490 --> 00:01:38,690 >> Y peth nesaf y byddwch yn gweld yn y llyfrgell yw ein bod yn diffinio math newydd o'r enw "llinyn." 26 00:01:38,690 --> 00:01:42,330 Mae'r llinell hon yn wir yn unig yn creu alias ar gyfer y math * torgoch, 27 00:01:42,330 --> 00:01:46,000 felly nid yw'n sydyn yn trwytho yn y math llinyn newydd gyda nodweddion 28 00:01:46,000 --> 00:01:49,650 gysylltiedig yn aml â gwrthrychau llinyn mewn ieithoedd eraill, 29 00:01:49,650 --> 00:01:50,850 megis hyd. 30 00:01:50,850 --> 00:01:55,180 Y rheswm rydym wedi gwneud hyn yw i darian rhaglenwyr newydd o'r manylion gwaedlyd 31 00:01:55,180 --> 00:01:57,580 o arwyddion nes eu bod yn barod. 32 00:01:57,580 --> 00:02:00,130 >> Mae rhan nesaf y ffeil pennawd yn y datganiad o swyddogaethau 33 00:02:00,130 --> 00:02:04,410 bod y llyfrgell yn darparu CS50 ynghyd â dogfennau. 34 00:02:04,410 --> 00:02:06,940 Sylwch ar y lefel o fanylder yn y sylwadau yma. 35 00:02:06,940 --> 00:02:10,560 Mae hyn yn super bwysig fel bod pobl yn gwybod sut i ddefnyddio swyddogaethau hyn. 36 00:02:10,560 --> 00:02:19,150 Yr ydym yn datgan, yn ei dro, swyddogaethau i annog y defnyddiwr a chars dychwelyd, dyblau, arnofio, ints, 37 00:02:19,150 --> 00:02:24,160 hir hiraethu, a llinynnau, gan ddefnyddio ein math llinyn hunain. 38 00:02:24,160 --> 00:02:26,260 Dilyn yr egwyddor o cuddio gwybodaeth, 39 00:02:26,260 --> 00:02:31,640 rydym wedi rhoi ein diffiniad yn ar wahân ffeil gweithredu c -. cs50.c-- 40 00:02:31,640 --> 00:02:35,110 lleoli yn y ffynhonnell defnyddiwr cyfeiriadur. 41 00:02:35,110 --> 00:02:38,040 Rydym wedi darparu y ffeil fel y gallwch fwrw golwg arno, 42 00:02:38,040 --> 00:02:41,490 dysgu oddi wrtho, ac yn ail-grynhoi ar beiriannau gwahanol os ydych yn dymuno, 43 00:02:41,490 --> 00:02:45,510 er ein bod yn meddwl ei bod yn well i weithio ar y peiriant ar gyfer y dosbarth. 44 00:02:45,510 --> 00:02:47,580 Beth bynnag, gadewch i ni edrych arno yn awr. 45 00:02:49,020 --> 00:02:54,620 >> Mae'r swyddogaethau GetChar, GetDouble, GetFloat, GetInt, a GetLongLong 46 00:02:54,620 --> 00:02:58,160 yn cael eu hadeiladu i gyd ar ben y swyddogaeth GetString. 47 00:02:58,160 --> 00:03:01,510 Mae'n troi allan eu bod i gyd yn dilyn y bôn yr un patrwm. 48 00:03:01,510 --> 00:03:04,870 Maent yn defnyddio dolen amser i annog y defnyddiwr i un llinell o fewnbwn. 49 00:03:04,870 --> 00:03:08,430 Maent yn dychwelyd gwerth arbennig os yw'r defnyddiwr mewnbynnau llinell wag. 50 00:03:08,430 --> 00:03:11,750 Maent yn ceisio gramadegu mewnbwn y defnyddiwr fel y math priodol, 51 00:03:11,750 --> 00:03:15,010 boed yn torgoch, a dwbl, arnofio, ac ati 52 00:03:15,010 --> 00:03:18,710 Ac yna maent yn naill ai ddychwelyd y canlyniad os y mewnbwn cael ei dosrannu yn llwyddiannus 53 00:03:18,710 --> 00:03:21,330 neu maent yn reprompt y defnyddiwr. 54 00:03:21,330 --> 00:03:24,230 >> Ar lefel uchel, nid oes dim anodd iawn eu datrys yma. 55 00:03:24,230 --> 00:03:28,760 Efallai eich bod wedi ysgrifennu cod yn yr un modd strwythuredig eich hun yn y gorffennol. 56 00:03:28,760 --> 00:03:34,720 Efallai mai'r rhan mwyaf cryptig-edrych yw'r alwad sscanf sy'n parses fewnbwn y defnyddiwr. 57 00:03:34,720 --> 00:03:38,160 Sscanf yn rhan o'r teulu trosi fformat mewnbwn. 58 00:03:38,160 --> 00:03:42,300 Mae'n byw yn safon io.h, ac mae ei gwaith yw dosrannu yn llinyn C, 59 00:03:42,300 --> 00:03:46,520 yn ôl fformat penodol, storio y canlyniadau gramadegu yn amrywio 60 00:03:46,520 --> 00:03:48,720 a ddarperir gan y galwr. 61 00:03:48,720 --> 00:03:53,570 Ers y mewnbwn swyddogaethau fformat trosi yn ddefnyddiol iawn, swyddogaethau a ddefnyddir yn eang 62 00:03:53,570 --> 00:03:56,160 nad ydynt yn super 'n athrylithgar ar y dechrau, 63 00:03:56,160 --> 00:03:58,300 byddwn yn mynd dros y ffordd y sscanf yn gweithio. 64 00:03:58,300 --> 00:04:03,330 >> Mae'r ddadl gyntaf i sscanf yn * torgoch - pwyntydd i gymeriad. 65 00:04:03,330 --> 00:04:05,150 Ar gyfer y swyddogaeth i weithio'n iawn, 66 00:04:05,150 --> 00:04:08,340 dylai cymeriad fod y nod cyntaf mewn llinyn C, 67 00:04:08,340 --> 00:04:12,270 derfynu gyda'r null \ 0 cymeriad. 68 00:04:12,270 --> 00:04:15,120 Mae hyn yn y llinyn i dosrannu 69 00:04:15,120 --> 00:04:18,269 Yr ail ddadl i sscanf yn llinyn fformat, 70 00:04:18,269 --> 00:04:20,839 pasio fel arfer yn gyson fel llinyn, 71 00:04:20,839 --> 00:04:24,040 ac efallai y byddwch wedi gweld llinyn fel hyn o'r blaen wrth ddefnyddio printf. 72 00:04:24,040 --> 00:04:28,650 Mae arwydd y cant yn y llinyn fformat yn dangos rhagnodwr trosi. 73 00:04:28,650 --> 00:04:30,850 Mae cymeriad yn syth ar ôl arwydd y cant, 74 00:04:30,850 --> 00:04:35,430 yn dangos y math C yr ydym am sscanf i drosi i. 75 00:04:35,430 --> 00:04:40,090 Yn GetInt, byddwch yn gweld bod yna d% a% c. 76 00:04:40,090 --> 00:04:48,690 Mae hyn yn golygu y bydd sscanf ceisio i int degol - y d% - a golosg - y c%. 77 00:04:48,690 --> 00:04:51,510 Ar gyfer pob rhagnodwr trosi yn y llinyn fformat, 78 00:04:51,510 --> 00:04:56,620 sscanf yn disgwyl dadl cyfatebol yn ddiweddarach yn ei restr ddadl. 79 00:04:56,620 --> 00:05:00,850 Rhaid i'r ddadl bwyntio at leoliad priodol deipio 80 00:05:00,850 --> 00:05:04,000 lle i storio canlyniad y trawsnewid. 81 00:05:04,000 --> 00:05:08,910 >> Y ffordd nodweddiadol o wneud hyn yw i greu newidyn ar y simnai cyn i'r alwad sscanf 82 00:05:08,910 --> 00:05:11,440 ar gyfer pob eitem yr ydych am ei gramadegu o'r llinyn 83 00:05:11,440 --> 00:05:15,520 ac yna defnyddiwch y gweithredwr cyfeiriad - y ampersand - i basio awgrymiadau 84 00:05:15,520 --> 00:05:19,100 i'r rhai newidynnau i'r alwad sscanf. 85 00:05:19,100 --> 00:05:22,720 Gallwch weld bod GetInt rydym yn ei wneud yn union hynny. 86 00:05:22,720 --> 00:05:28,240 Hawl cyn i'r alwad sscanf, rydym yn datgan int o'r enw n a c galwad torgoch ar y simnai, 87 00:05:28,240 --> 00:05:32,340 ac rydym yn pasio awgrymiadau iddynt i mewn i'r alwad sscanf. 88 00:05:32,340 --> 00:05:35,800 Rhoi newidynnau hyn ar y pentwr yn cael ei ffafrio dros ddefnyddio gofod a ddyrannwyd 89 00:05:35,800 --> 00:05:39,350 ar y domen gyda malloc, ers i chi osgoi'r uwchben yr alwad malloc, 90 00:05:39,350 --> 00:05:43,060 ac nid oes rhaid i chi boeni am gollwng cof. 91 00:05:43,060 --> 00:05:47,280 Nid yw Cymeriadau nad rhagddodi gan arwydd y cant yn annog trosi. 92 00:05:47,280 --> 00:05:50,380 Yn hytrach maent ond yn ychwanegu at y fanyleb fformat. 93 00:05:50,380 --> 00:05:56,500 >> Er enghraifft, os yw'r llinyn fformat GetInt oedd d% yn lle hynny, 94 00:05:56,500 --> 00:05:59,800 Byddai sscanf chwilio am y llythyr a ddilynir gan int, 95 00:05:59,800 --> 00:06:04,360 ac er y byddai'n ymdrechu i drawsnewid y int, ni fyddai'n gwneud unrhyw beth arall gyda'r a. 96 00:06:04,360 --> 00:06:07,440 Yr unig eithriad i hyn yw gofod. 97 00:06:07,440 --> 00:06:11,030 Cymeriadau gofod gwyn yn y llinyn fformat yn cyd-fynd unrhyw swm o whitespace - 98 00:06:11,030 --> 00:06:12,890 hyd yn oed ddim o gwbl. 99 00:06:12,890 --> 00:06:18,100 Felly, dyna pam y sylw yn sôn o bosibl arwain a / neu llusgo whitespace. 100 00:06:18,100 --> 00:06:22,910 Felly, bydd ar y pwynt hwn mae'n edrych fel ein galwad sscanf ceisio gramadegu llinyn mewnbwn y defnyddiwr 101 00:06:22,910 --> 00:06:25,380 drwy edrych am blaenllaw posibl gofod, 102 00:06:25,380 --> 00:06:29,300 wedi'i ddilyn gan int fydd yn cael ei drosi a'i storio mewn amrywiol int y n 103 00:06:29,300 --> 00:06:33,090 dilyn gan rai faint o gofod, a ddilynir gan gymeriad 104 00:06:33,090 --> 00:06:35,810 storio yn y c amrywiol torgoch. 105 00:06:35,810 --> 00:06:37,790 >> Beth am y gwerth dychwelyd? 106 00:06:37,790 --> 00:06:41,560 Bydd Sscanf dosrannu'r llinell mewnbwn o'r dechrau i'r diwedd, 107 00:06:41,560 --> 00:06:44,860 rhoi'r gorau pan fydd yn cyrraedd y diwedd neu pan fydd cymeriad yn y mewnbwn 108 00:06:44,860 --> 00:06:49,320 yn cyfateb cymeriad fformat neu pan na all wneud trosi. 109 00:06:49,320 --> 00:06:52,690 Gwerth dychwelyd Mae'n cael ei ddefnyddio i ddadlau pryd y rhoes heibio. 110 00:06:52,690 --> 00:06:55,670 Os caiff ei stopio, oherwydd ei fod yn cyrraedd diwedd y llinyn mewnbwn 111 00:06:55,670 --> 00:07:00,630 cyn gwneud unrhyw addasiadau a chyn methu i gyd-fynd yn rhan o'r llinyn fformat, 112 00:07:00,630 --> 00:07:04,840 yna bydd y EOF cyson arbennig yn cael ei ddychwelyd. 113 00:07:04,840 --> 00:07:08,200 Fel arall, mae'n dychwelyd y nifer o addasiadau llwyddiannus, 114 00:07:08,200 --> 00:07:14,380 a allai fod yn 0, 1, neu 2, gan ein bod wedi gofyn am ddau drosiad. 115 00:07:14,380 --> 00:07:19,000 Yn ein hachos ni, rydym eisiau gwneud yn siŵr bod y defnyddiwr deipio mewn int a dim ond int. 116 00:07:19,000 --> 00:07:23,370 >> Felly, rydym am sscanf i ddychwelyd 1. Gweler pam? 117 00:07:23,370 --> 00:07:26,850 Os sscanf dychwelyd 0, yna nid oes addasiadau yn cael eu gwneud, 118 00:07:26,850 --> 00:07:31,690 felly mae'r defnyddiwr deipio rhywbeth ar wahân i int ar ddechrau'r mewnbwn. 119 00:07:31,690 --> 00:07:37,100 Os sscanf yn dychwelyd 2, yna bydd y defnyddiwr yn briodol ei deipio i mewn ar ddechrau'r mewnbwn, 120 00:07:37,100 --> 00:07:41,390 ond maent yn teipio ac yna mewn rhyw nodwedd di-nod gofod wedyn 121 00:07:41,390 --> 00:07:44,940 ers y% llwyddo c trosi. 122 00:07:44,940 --> 00:07:49,570 Wow, mae hynny'n dipyn o esboniad hir am un alwad swyddogaeth. 123 00:07:49,570 --> 00:07:53,460 Beth bynnag, os ydych am fwy o wybodaeth am sscanf a'i brodyr a chwiorydd, 124 00:07:53,460 --> 00:07:57,130 edrychwch ar y tudalennau dyn, Google, neu'r ddau. 125 00:07:57,130 --> 00:07:58,780 Mae llawer o opsiynau llinyn fformat, 126 00:07:58,780 --> 00:08:03,830 a gall y rhain arbed llawer o lafur llaw wrth geisio gramadegu llinynnau yn C. 127 00:08:03,830 --> 00:08:07,180 >> Mae'r swyddogaeth olaf yn y llyfrgell i edrych arno yw GetString. 128 00:08:07,180 --> 00:08:10,310 Mae'n troi allan y GetString yn swyddogaeth anodd i ysgrifennu'n iawn, 129 00:08:10,310 --> 00:08:14,290 er ei fod yn ymddangos fel y fath syml, tasg gyffredin. 130 00:08:14,290 --> 00:08:16,170 Pam mae hyn yn wir? 131 00:08:16,170 --> 00:08:21,380 Wel, gadewch i ni feddwl am sut rydym yn mynd i storio y llinell y mae'r defnyddiwr mathau mewn 132 00:08:21,380 --> 00:08:23,880 Gan fod llinyn yn ddilyniant o chars, 133 00:08:23,880 --> 00:08:26,430 efallai y byddwn eisiau ei storio mewn arae ar y simnai, 134 00:08:26,430 --> 00:08:31,250 ond byddai angen i ni wybod pa mor hir y casgliad yn mynd i fod pan fyddwn yn datgan ei. 135 00:08:31,250 --> 00:08:34,030 Yn yr un modd, os ydym am ei roi ar y domen, 136 00:08:34,030 --> 00:08:38,090 angen i ni roi i malloc y nifer o bytes ydym am i gronfa wrth gefn, 137 00:08:38,090 --> 00:08:39,730 ond mae hyn yn amhosibl. 138 00:08:39,730 --> 00:08:42,760 Nid oes gennym unrhyw syniad faint o chars bydd y defnyddiwr deipio i mewn 139 00:08:42,760 --> 00:08:46,590 cyn i'r defnyddiwr mewn gwirionedd yn eu teipio. 140 00:08:46,590 --> 00:08:50,720 >> Mae ateb naïf i'r broblem hon ydy at jyst cadw darn mawr o ofod, yn dweud, 141 00:08:50,720 --> 00:08:54,540 bloc o 1000 chars ar gyfer mewnbwn y defnyddiwr, 142 00:08:54,540 --> 00:08:57,980 gan dybio na fyddai byth y defnyddiwr deipio llinyn sy'n hir. 143 00:08:57,980 --> 00:09:00,810 Mae hwn yn syniad gwael am ddau reswm. 144 00:09:00,810 --> 00:09:05,280 Yn gyntaf, gan dybio bod defnyddwyr nad ydynt fel arfer yn teipio mewn llinynnau hynny hir, 145 00:09:05,280 --> 00:09:07,610 gallech wastraffu llawer o gof. 146 00:09:07,610 --> 00:09:10,530 Ar beiriannau modern, efallai na fydd hyn fod yn broblem os byddwch yn gwneud hyn 147 00:09:10,530 --> 00:09:13,890 mewn un neu ddau o achosion ynysig, 148 00:09:13,890 --> 00:09:17,630 ond os ydych yn cymryd mewnbwn defnyddiwr mewn cylch a storio ar gyfer defnydd yn ddiweddarach, 149 00:09:17,630 --> 00:09:20,870 gallwch chi yn gyflym sugno i fyny tunnell o gof. 150 00:09:20,870 --> 00:09:24,450 Yn ogystal, os bydd y rhaglen ydych yn ysgrifennu ar gyfer cyfrifiadur llai - 151 00:09:24,450 --> 00:09:28,100 dyfais fel smartphone neu rywbeth arall gyda cof cyfyngedig - 152 00:09:28,100 --> 00:09:32,060 Bydd yr ateb hwn yn achosi problemau yn llawer cyflymach. 153 00:09:32,060 --> 00:09:36,450 Yr ail, rheswm mwy difrifol i beidio â gwneud hyn yw ei fod yn gadael eich rhaglen sy'n agored i niwed 154 00:09:36,450 --> 00:09:39,710 i hyn a elwir yn byffer ymosodiad gorlifo. 155 00:09:39,710 --> 00:09:45,840 Mewn rhaglennu, byffer o gof a ddefnyddir i storio dros dro data mewnbwn neu allbwn, 156 00:09:45,840 --> 00:09:48,980 sydd yn yr achos hwn yw ein 1000-torgoch bloc. 157 00:09:48,980 --> 00:09:53,370 Mae gorlif byffer yn digwydd pan fydd data yn cael ei ysgrifennu ar ôl diwedd y bloc. 158 00:09:53,370 --> 00:09:57,790 >> Er enghraifft, os yw defnyddiwr yn ei wneud fath mewn mwy na 1000 o chars. 159 00:09:57,790 --> 00:10:01,570 Efallai eich bod wedi cael profiad o hyn yn ddamweiniol wrth raglennu gyda arrays. 160 00:10:01,570 --> 00:10:05,620 Os oes gennych amrywiaeth o 10 ints, nid oes dim yn eich atal rhag ceisio i ddarllen neu ysgrifennu 161 00:10:05,620 --> 00:10:07,810 y int 15fed. 162 00:10:07,810 --> 00:10:10,000 Nid oes unrhyw rybuddion compiler neu wallau. 163 00:10:10,000 --> 00:10:13,250 Mae'r rhaglen yn unig blunders yn syth ymlaen ac yn cael gafael cof 164 00:10:13,250 --> 00:10:18,150 lle mae'n credu y bydd y int 15 fod, a gall hyn trosysgrifo eich newidynnau eraill. 165 00:10:18,150 --> 00:10:22,040 Yn yr achos gwaethaf, gallwch trosysgrifo rhai mewnol fydd eich rhaglen 166 00:10:22,040 --> 00:10:26,820 mecanweithiau rheoli, gan achosi eich rhaglen i mewn gwirionedd yn gweithredu cyfarwyddiadau gwahanol 167 00:10:26,820 --> 00:10:28,340 nag oeddech yn bwriadu. 168 00:10:28,340 --> 00:10:31,360 >> Nawr, nid yw'n gyffredin i wneud hyn yn ddamweiniol, 169 00:10:31,360 --> 00:10:35,150 ond mae hyn yn dechneg eithaf cyffredin sy'n guys ddrwg yn eu defnyddio i dorri rhaglenni 170 00:10:35,150 --> 00:10:39,080 a rhoi côd maleisus ar gyfrifiaduron pobl eraill. 171 00:10:39,080 --> 00:10:42,910 Felly, ni allwn ddefnyddio dim ond ein ateb naïf. 172 00:10:42,910 --> 00:10:45,590 Rydym angen ffordd i atal ein rhaglenni o fod yn agored i niwed 173 00:10:45,590 --> 00:10:47,880 i byffer ymosodiad gorlifo. 174 00:10:47,880 --> 00:10:51,430 I wneud hyn, mae angen i ni wneud yn siŵr y gall ein byffer dyfu wrth i ni ddarllen 175 00:10:51,430 --> 00:10:53,850 mwy o fewnbwn gan y defnyddiwr. 176 00:10:53,850 --> 00:10:57,440 Yr ateb? Rydym yn defnyddio tomen glustog a ddyrannwyd. 177 00:10:57,440 --> 00:10:59,950 Ers y gallwn newid maint gan ddefnyddio'r resize swyddogaeth realloc, 178 00:10:59,950 --> 00:11:04,580 ac rydym yn cadw golwg ar ddau rif - y mynegai y slot gwag nesaf yn y byffer 179 00:11:04,580 --> 00:11:08,390 a hyd neu allu y byffer. 180 00:11:08,390 --> 00:11:13,210 Rydym yn darllen yn chars gan y defnyddiwr un ar y tro gan ddefnyddio'r swyddogaeth fgetc. 181 00:11:13,210 --> 00:11:19,360 Mae'r ddadl y swyddogaeth fgetc cymryd - stdin - yn gyfeiriad at y llinyn mewnbwn safonol, 182 00:11:19,360 --> 00:11:23,810 sydd yn sianel mewnbwn preconnected sy'n cael ei ddefnyddio i drosglwyddo cyfraniad y defnyddiwr 183 00:11:23,810 --> 00:11:26,270 oddi wrth y derfynell i'r rhaglen. 184 00:11:26,270 --> 00:11:29,890 >> Pryd bynnag y defnyddiwr mathau mewn cymeriad newydd, rydym yn gwirio i weld a yw'r mynegai 185 00:11:29,890 --> 00:11:35,810 y slot rhad ac am ddim nesaf ac 1 yn fwy nag y gall y byffer. 186 00:11:35,810 --> 00:11:39,690 Mae'r 1 yn dod i mewn oherwydd os bydd y mynegai rhad ac am ddim nesaf yw 5, 187 00:11:39,690 --> 00:11:44,150 yna mae'n rhaid i hyd ein byffer fod yn 6 Diolch i 0 mynegeio. 188 00:11:44,150 --> 00:11:48,350 Os ydym wedi rhedeg allan o le yn y byffer, yna rydym yn ceisio newid maint iddo, 189 00:11:48,350 --> 00:11:51,690 dyblu fel bod rydym yn torri i lawr ar y nifer o weithiau ein bod yn newid maint 190 00:11:51,690 --> 00:11:54,760 os yw'r defnyddiwr yn teipio mewn llinyn hir iawn. 191 00:11:54,760 --> 00:11:57,950 Os yw'r llinyn wedi gotten yn rhy hir, neu os ydym yn rhedeg allan o gof domen, 192 00:11:57,950 --> 00:12:01,350 ein rhyddhau ein clustogi a null dychwelyd. 193 00:12:01,350 --> 00:12:04,170 >> Yn olaf, rydym yn atodi y torgoch at y byffer. 194 00:12:04,170 --> 00:12:08,200 Unwaith y bydd y hits defnyddiwr fynd i mewn neu ddychwelyd, gan nodi llinell newydd, 195 00:12:08,200 --> 00:12:12,050 neu 'r torgoch arbennig - rheoli d - sy'n arwydd o ddiwedd y mewnbwn, 196 00:12:12,050 --> 00:12:16,240 rydym yn ei wneud gwiriad i weld os yw'r defnyddiwr yn teipio mewn gwirionedd yn unrhyw beth o gwbl. 197 00:12:16,240 --> 00:12:18,820 Os na, byddwn yn dychwelyd null. 198 00:12:18,820 --> 00:12:22,280 Fel arall, oherwydd ein byffer yn ôl pob tebyg yn fwy nag sydd ei angen, 199 00:12:22,280 --> 00:12:24,830 yn yr achos gwaethaf ei fod bron ddwywaith mor fawr gan fod angen 200 00:12:24,830 --> 00:12:27,830 ers i ni ddyblu bob tro y byddwn yn newid maint, 201 00:12:27,830 --> 00:12:31,840 rydym yn gwneud copi newydd o'r llinyn gan ddefnyddio dim ond faint o le sydd ei angen arnom. 202 00:12:31,840 --> 00:12:34,220 Rydym yn ychwanegu 1 yn ychwanegol i'r alwad malloc, 203 00:12:34,220 --> 00:12:37,810 fel bod o le ar gyfer y cymeriad terminator arbennig null - y \ 0, 204 00:12:37,810 --> 00:12:41,990 yr ydym yn atodi i'r llinyn ar ôl i ni eu copïo yng ngweddill y cymeriadau, 205 00:12:41,990 --> 00:12:45,060 defnyddio strncpy yn hytrach na strcpy 206 00:12:45,060 --> 00:12:48,830 fel y gallwn nodi yn union faint o chars ydym yn awyddus i'w efelychu. 207 00:12:48,830 --> 00:12:51,690 Strcpy copļau nes ei fod yn taro \ 0. 208 00:12:51,690 --> 00:12:55,740 Yna, rydym yn rhyddhau ein clustogi a dychwelyd y copi i'r galwr. 209 00:12:55,740 --> 00:12:59,840 >> Pwy sy'n gwybod y gallai swyddogaeth o'r fath syml-ymddangosiadol fod yn gymhleth felly? 210 00:12:59,840 --> 00:13:02,820 Nawr eich bod yn gwybod beth sy'n mynd i mewn i'r llyfrgell CS50. 211 00:13:02,820 --> 00:13:06,470 >> Fy enw i yw Nate Hardison, ac mae hyn yn CS50. 212 00:13:06,470 --> 00:13:08,350 [CS50.TV]