1 00:00:00,000 --> 00:00:02,490 [Powered by Google Translate] [ЦС50 Библиотека] 2 00:00:02,490 --> 00:00:04,220 [Нејт Хардисон] [Универзитет Харвард] 3 00:00:04,220 --> 00:00:07,260 [Ово је ЦС50. ЦС50.ТВ] 4 00:00:07,260 --> 00:00:11,510 Тхе ЦС50 библиотека је корисна алатка која смо инсталирали на уређају 5 00:00:11,510 --> 00:00:15,870 да би се лакше за вас да напишете програме који брзе корисници за улаз. 6 00:00:15,870 --> 00:00:21,670 У овом видеу, ми ћемо повући завесу и погледајте шта је тачно у ЦС50 библиотеци. 7 00:00:21,670 --> 00:00:25,520 >> У споту о Ц библиотека, говоримо о томе како си # инцлуде заглавља датотеке 8 00:00:25,520 --> 00:00:27,570 библиотеке у вашем изворном коду, 9 00:00:27,570 --> 00:00:31,150 и онда се повежете са бинарном фајлу библиотеке током повезује фазе 10 00:00:31,150 --> 00:00:33,140 на компилацији процеса. 11 00:00:33,140 --> 00:00:36,440 Заглавље датотеке одредити интерфејс библиотеке. 12 00:00:36,440 --> 00:00:41,280 То јест, они детаљно све ресурсе да библиотека има на располагању за вас да користите, 13 00:00:41,280 --> 00:00:45,250 као функција декларацијама, константи и типова података. 14 00:00:45,250 --> 00:00:48,890 Бинарни библиотека фајл садржи примену библиотеке, 15 00:00:48,890 --> 00:00:54,580 која је састављена из заглавља библиотеке фајлова и библиотека је Ц изворног кода. фајлови. 16 00:00:54,580 --> 00:00:59,820 >> Бинарни библиотека датотека није веома интересантно да погледамо, јер то је, добро, у бинарном. 17 00:00:59,820 --> 00:01:03,300 Дакле, хајде да погледамо заглавља датотеке за библиотеку уместо. 18 00:01:03,300 --> 00:01:07,710 У овом случају, постоји само један хеадер фајл под цс50.х. 19 00:01:07,710 --> 00:01:11,040 Ми смо га инсталирали у упутству укључују директоријум 20 00:01:11,040 --> 00:01:15,150 заједно са другом систему библиотека заглавља датотека. 21 00:01:15,150 --> 00:01:21,530 >> Једна од првих ствари које ћете приметити јесте да цс50.х # укључује заглавља датотека из других библиотека - 22 00:01:21,530 --> 00:01:25,670 плутају, границе, стандардни Боол и стандардни либ. 23 00:01:25,670 --> 00:01:28,800 Опет, након принцип не прекрајањем точак, 24 00:01:28,800 --> 00:01:33,490 смо изградили смо се у ЦС0 библиотеку помоћу алатки које друге прописане за нас. 25 00:01:33,490 --> 00:01:38,690 >> Следећа ствар коју ћете видети у библиотеци је да дефинишемо нову врсту под именом "стринг". 26 00:01:38,690 --> 00:01:42,330 Ова линија заиста само ствара псеудоним за цхар * типа, 27 00:01:42,330 --> 00:01:46,000 па не магично прожимати нови тип стринг са атрибутима 28 00:01:46,000 --> 00:01:49,650 обично повезује са гудачке објеката у другим језицима, 29 00:01:49,650 --> 00:01:50,850 као што су дужине. 30 00:01:50,850 --> 00:01:55,180 Разлог што смо урадили јесте да заштити нових програмера из гори детаља 31 00:01:55,180 --> 00:01:57,580 од показивача док смо спремни. 32 00:01:57,580 --> 00:02:00,130 >> Следећи део заглавља датотеке је декларација функција 33 00:02:00,130 --> 00:02:04,410 да је ЦС50 библиотека обезбеђује заједно са документацијом. 34 00:02:04,410 --> 00:02:06,940 Обратите пажњу на ниво детаља у коментарима овде. 35 00:02:06,940 --> 00:02:10,560 Ово је супер важно да људи знају како да користе ове функције. 36 00:02:10,560 --> 00:02:19,150 Ми изјављујемо, заузврат, функционише како би подстакао корисника и вратили цхарс, дубл, плута, Интс, 37 00:02:19,150 --> 00:02:24,160 дуго чезне, и гудаче, користећи сопствену стринг тип. 38 00:02:24,160 --> 00:02:26,260 Након принципу информација крије, 39 00:02:26,260 --> 00:02:31,640 ми смо ставили нашу дефиницију у посебан фајл Ц имплементације. - цс50.ц-- 40 00:02:31,640 --> 00:02:35,110 налази у директоријуму корисника извора. 41 00:02:35,110 --> 00:02:38,040 Смо навели тај фајл тако да можете да погледате на њега, 42 00:02:38,040 --> 00:02:41,490 учити од њега и компајлирате га на различитим машинама, ако желите, 43 00:02:41,490 --> 00:02:45,510 иако ми мислимо да је боље да се ради на апарату за ову класу. 44 00:02:45,510 --> 00:02:47,580 У сваком случају, хајде да сада погледамо. 45 00:02:49,020 --> 00:02:54,620 >> Функције гетцхар, ГетДоубле, ГетФлоат, ГетИнт, и ГетЛонгЛонг 46 00:02:54,620 --> 00:02:58,160 Сви изграђена на врху ГетСтринг функције. 47 00:02:58,160 --> 00:03:01,510 Испоставило се да су сви они прате суштини исти образац. 48 00:03:01,510 --> 00:03:04,870 Они користе вхиле петљу да подстакне корисника за једну линију улаза. 49 00:03:04,870 --> 00:03:08,430 Они врати посебну вредност ако корисник улази празну линију. 50 00:03:08,430 --> 00:03:11,750 Они покушавају да парсира улаз корисниково као одговарајућег типа, 51 00:03:11,750 --> 00:03:15,010 било да је знак, дупли, плутају, итд 52 00:03:15,010 --> 00:03:18,710 И онда они или вратити резултат ако је улаз је успешно анализирати 53 00:03:18,710 --> 00:03:21,330 или су репромпт корисника. 54 00:03:21,330 --> 00:03:24,230 >> На високом нивоу, овде нема ничег заиста лукав. 55 00:03:24,230 --> 00:03:28,760 Можда сте написали сличне структуре кода себе у прошлости. 56 00:03:28,760 --> 00:03:34,720 Можда највише криптичан изгледа део је ссцанф позив да анализира допринос корисника. 57 00:03:34,720 --> 00:03:38,160 Ссцанф је део улазног породице формату конверзије. 58 00:03:38,160 --> 00:03:42,300 Она живи у стандардној ио.х, а његов посао је да анализирамо царски стринг, 59 00:03:42,300 --> 00:03:46,520 према одређеном формату, памтећи рашчланити резултате у променљива 60 00:03:46,520 --> 00:03:48,720 обезбеђује позиваоца. 61 00:03:48,720 --> 00:03:53,570 Пошто су улазни формат конверзије функције су веома корисни, широко коришћеним функцијама 62 00:03:53,570 --> 00:03:56,160 који нису супер интуитивно на први поглед, 63 00:03:56,160 --> 00:03:58,300 ићи ћемо преко колико ссцанф ради. 64 00:03:58,300 --> 00:04:03,330 >> Први аргумент је ссцанф цхар * - показивач на карактер. 65 00:04:03,330 --> 00:04:05,150 За функција ради исправно, 66 00:04:05,150 --> 00:04:08,340 тај лик би требало да буде први карактер ниске Ц, 67 00:04:08,340 --> 00:04:12,270 престаје са нултим \ 0 карактера. 68 00:04:12,270 --> 00:04:15,120 Ово је стринг да анализирамо 69 00:04:15,120 --> 00:04:18,269 Други аргумент ссцанф је формат стринг, 70 00:04:18,269 --> 00:04:20,839 обично прошао у као стринг константа, 71 00:04:20,839 --> 00:04:24,040 а можда сте видели овако ниску пре када се користи принтф. 72 00:04:24,040 --> 00:04:28,650 Посто знак у формату стрингу указује на конверзију задавач. 73 00:04:28,650 --> 00:04:30,850 Карактер одмах након знак за проценат, 74 00:04:30,850 --> 00:04:35,430 означава Ц тип који желимо ссцанф да конвертујете. 75 00:04:35,430 --> 00:04:40,090 У ГетИнт, видиш да постоји% д и% д. 76 00:04:40,090 --> 00:04:48,690 То значи да ће покушати да ссцанф децимални ИНТ - је% д - и цхар - је% ц. 77 00:04:48,690 --> 00:04:51,510 За сваку конверзију пројектанта у формату ниске, 78 00:04:51,510 --> 00:04:56,620 ссцанф очекује касније одговарајући аргумент у свом листе аргумената. 79 00:04:56,620 --> 00:05:00,850 Тај аргумент мора да укаже на одговарајуће локације куцани 80 00:05:00,850 --> 00:05:04,000 у којима се складишти резултат конверзије. 81 00:05:04,000 --> 00:05:08,910 >> Типичан начин да то урадите је да се створи променљиву на стек пре ссцанф позива 82 00:05:08,910 --> 00:05:11,440 за сваку ставку коју желите да изузме из стринга 83 00:05:11,440 --> 00:05:15,520 а затим користите оператор адреса - амперсанд - да прође показиваче 84 00:05:15,520 --> 00:05:19,100 тих променљивих до ссцанф позива. 85 00:05:19,100 --> 00:05:22,720 Можете видети да је у ГетИнт смо управо урадили. 86 00:05:22,720 --> 00:05:28,240 Право пред ссцанф позива, изјављујемо инт н зове и цхар позива ц на стек, 87 00:05:28,240 --> 00:05:32,340 и ми проћи показиваче на њих у ссцанф позив. 88 00:05:32,340 --> 00:05:35,800 Стављање ове променљиве на стек је предност у односу на коришћење простора додељеног 89 00:05:35,800 --> 00:05:39,350 на гомили са маллоц, пошто сте избегло изнад главе у маллоц позива, 90 00:05:39,350 --> 00:05:43,060 а ви не морате да бринете о цури меморију. 91 00:05:43,060 --> 00:05:47,280 Карактери не префиксом стране одсто знак не подстакне конверзију. 92 00:05:47,280 --> 00:05:50,380 Напротив, они само додају на формату спецификацији. 93 00:05:50,380 --> 00:05:56,500 >> На пример, ако је формат стринг у ГетИнт су уместо% д 94 00:05:56,500 --> 00:05:59,800 ссцанф ће тражити писмо једног уследио инт, 95 00:05:59,800 --> 00:06:04,360 и док би покушати да конвертујете инт, то не би ништа друго са наведеним. 96 00:06:04,360 --> 00:06:07,440 Једини изузетак је размак. 97 00:06:07,440 --> 00:06:11,030 Бели простор ликови у формату ниске одговара било који износ од белине - 98 00:06:11,030 --> 00:06:12,890 чак ни уопште. 99 00:06:12,890 --> 00:06:18,100 Дакле, то је разлог зашто је коментар помиње евентуално са водећим и / или пратеће белине. 100 00:06:18,100 --> 00:06:22,910 Дакле, у овом тренутку изгледа као наша ссцанф позив ће покушати да анализирамо стринг унос корисников 101 00:06:22,910 --> 00:06:25,380 провером за могућу водећих размака, 102 00:06:25,380 --> 00:06:29,300 следи инт који ће бити конвертован и складишти у инт променљиве н 103 00:06:29,300 --> 00:06:33,090 праћено неком износу од белине, а потом знака 104 00:06:33,090 --> 00:06:35,810 чувају у цхар променљиве ц. 105 00:06:35,810 --> 00:06:37,790 >> Шта је повратак вредности? 106 00:06:37,790 --> 00:06:41,560 Ссцанф ће анализирати линију за унос од почетка до краја, 107 00:06:41,560 --> 00:06:44,860 заустављајући се када дође до краја, или када је карактер улазне 108 00:06:44,860 --> 00:06:49,320 не одговара карактер формата или када не може да направи конверзију. 109 00:06:49,320 --> 00:06:52,690 То је повратак вредност се користи да издвојим када је заустављен. 110 00:06:52,690 --> 00:06:55,670 Ако је заустављен, јер је стигла до краја улазног стринга 111 00:06:55,670 --> 00:07:00,630 пре доношења било какве конверзије и пре не успева да одговара део формату ниске, 112 00:07:00,630 --> 00:07:04,840 онда специјални константа ЕОФ враћа. 113 00:07:04,840 --> 00:07:08,200 У супротном, враћа број успешних конверзија, 114 00:07:08,200 --> 00:07:14,380 што би могло да буде 0, 1 или 2, јер смо тражили два конверзије. 115 00:07:14,380 --> 00:07:19,000 У нашем случају, желимо да се уверите да је корисник откуцао у инт и само инт. 116 00:07:19,000 --> 00:07:23,370 >> Дакле, желимо да се врати ссцанф 1. Погледајте зашто? 117 00:07:23,370 --> 00:07:26,850 Ако ссцанф вратио 0, онда нема конверзије су направљене, 118 00:07:26,850 --> 00:07:31,690 тако да корисник откуцао нешто друго него интег на почетку улаза. 119 00:07:31,690 --> 00:07:37,100 Ако ссцанф врати 2, онда корисник није исправно да откуцате у на почетку улаз, 120 00:07:37,100 --> 00:07:41,390 али су потом уписали у неком не-Белина карактера касније 121 00:07:41,390 --> 00:07:44,940 Од% ц конверзија успео. 122 00:07:44,940 --> 00:07:49,570 Вау, то је прилично дугачак објашњење за једног позива функције. 123 00:07:49,570 --> 00:07:53,460 У сваком случају, ако желите више информација о ссцанф и његових браће и сестара, 124 00:07:53,460 --> 00:07:57,130 проверите ман странице, Гоогле, или оба. 125 00:07:57,130 --> 00:07:58,780 Постоји много опција формата гудачке, 126 00:07:58,780 --> 00:08:03,830 а то може да вам уштеди пуно мануелног рада када покушава да изузме конце у Ц. 127 00:08:03,830 --> 00:08:07,180 >> Коначна функција у библиотеци да погледамо ГетСтринг. 128 00:08:07,180 --> 00:08:10,310 Испоставило се да је ГетСтринг је незгодно функција правилно писати, 129 00:08:10,310 --> 00:08:14,290 иако изгледа као да тако једноставан, заједничком задатку. 130 00:08:14,290 --> 00:08:16,170 Зашто је ово тако? 131 00:08:16,170 --> 00:08:21,380 Па, хајде да размишљамо о томе како ћемо да сачувате линију да корисник укуцава ин 132 00:08:21,380 --> 00:08:23,880 Пошто стринг је низ карактера, 133 00:08:23,880 --> 00:08:26,430 можемо да га сачувате у низу на стек, 134 00:08:26,430 --> 00:08:31,250 али би требало да знају колико дуго се низ ће бити када га прогласи. 135 00:08:31,250 --> 00:08:34,030 Исто тако, ако желимо да га стави на гомилу, 136 00:08:34,030 --> 00:08:38,090 морамо да прође да маллоц број бајтова желимо да резерве, 137 00:08:38,090 --> 00:08:39,730 али ово је немогуће. 138 00:08:39,730 --> 00:08:42,760 Немамо појма колико слова корисник ће куцали 139 00:08:42,760 --> 00:08:46,590 пре корисник заправо их откуцате. 140 00:08:46,590 --> 00:08:50,720 >> Наивно решење овог проблема је да се само резервише велики комад простора, рецимо, 141 00:08:50,720 --> 00:08:54,540 блок 1000 цхарс за унос корисника, 142 00:08:54,540 --> 00:08:57,980 под претпоставком да је корисник никада не би откуцајте у низу тако дуго. 143 00:08:57,980 --> 00:09:00,810 То је лоша идеја из два разлога. 144 00:09:00,810 --> 00:09:05,280 Прво, под претпоставком да корисници обично не куцате у жицама толико дуго, 145 00:09:05,280 --> 00:09:07,610 бисте могли да троше много меморије. 146 00:09:07,610 --> 00:09:10,530 На савременим машинама, ово не може бити проблем ако то радите 147 00:09:10,530 --> 00:09:13,890 у једној или две изоловане случајеве, 148 00:09:13,890 --> 00:09:17,630 али ако узимаш улаз корисника у петљу и чување за каснију употребу, 149 00:09:17,630 --> 00:09:20,870 можете брзо да сиса до тону меморије. 150 00:09:20,870 --> 00:09:24,450 Поред тога, ако програм који пишете је за мањи рачунар - 151 00:09:24,450 --> 00:09:28,100 уређај као што је смартпхоне или нешто друго са ограниченом меморијом - 152 00:09:28,100 --> 00:09:32,060 ово решење ће изазвати проблеме много брже. 153 00:09:32,060 --> 00:09:36,450 Други, озбиљнији разлог да не урадите ово јесте да оставља свој програм рањива 154 00:09:36,450 --> 00:09:39,710 да оно што се зове бафера напад. 155 00:09:39,710 --> 00:09:45,840 У програмирању, бафер меморије се користи за привремено чување улаза или излаза података, 156 00:09:45,840 --> 00:09:48,980 која је у овом случају је наша 1000-знак блок. 157 00:09:48,980 --> 00:09:53,370 Бафера се јавља када се подаци написано прошлост крају блока. 158 00:09:53,370 --> 00:09:57,790 >> На пример, ако корисник заправо ради тип у више од 1000 карактера. 159 00:09:57,790 --> 00:10:01,570 Можда сте искусили ово случајно, када програмирања са низовима. 160 00:10:01,570 --> 00:10:05,620 Ако имате низ од 10 Интс, ништа вас зауставља од покушаја да читају и пишу 161 00:10:05,620 --> 00:10:07,810 15. инт. 162 00:10:07,810 --> 00:10:10,000 Нема компилатор упозорења или грешке. 163 00:10:10,000 --> 00:10:13,250 Програм само греске равно и приступа меморију 164 00:10:13,250 --> 00:10:18,150 где он мисли 15. инт ће бити, а то може заменити своје друге варијабле. 165 00:10:18,150 --> 00:10:22,040 У најгорем случају, можете заменити неким од интерних вашег програма 166 00:10:22,040 --> 00:10:26,820 контролни механизми, изазивајући свој програм да заиста изврши различите инструкције 167 00:10:26,820 --> 00:10:28,340 него што сте намеравали. 168 00:10:28,340 --> 00:10:31,360 >> Сада, није уобичајено да се то уради случајно, 169 00:10:31,360 --> 00:10:35,150 али ово је прилично уобичајена техника која лоши момци користе да се пробије програме 170 00:10:35,150 --> 00:10:39,080 и стави злонамерног кода на рачунарима других људи. 171 00:10:39,080 --> 00:10:42,910 Дакле, не можемо да користимо само наше наивно решење. 172 00:10:42,910 --> 00:10:45,590 Морамо начин да се спречи наше програме од тога рањиви 173 00:10:45,590 --> 00:10:47,880 у нападу бафера. 174 00:10:47,880 --> 00:10:51,430 Да бисте то урадили, морамо да осигурамо да наша бафер расте као што смо прочитали 175 00:10:51,430 --> 00:10:53,850 више улаз од корисника. 176 00:10:53,850 --> 00:10:57,440 Решење? Ми користимо гомилу додељеног бафер. 177 00:10:57,440 --> 00:10:59,950 Пошто можемо величину то користећи промените величину реаллоц функцију, 178 00:10:59,950 --> 00:11:04,580 и ми смо пратили два броја - индекс следећег празан слот у бафер 179 00:11:04,580 --> 00:11:08,390 и дужина или капацитет бафера. 180 00:11:08,390 --> 00:11:13,210 Читамо у цхарс од корисника једном у времену помоћу фгетц функцију. 181 00:11:13,210 --> 00:11:19,360 Тхе аргумент на фгетц функција траје - стдин - је референца на стандардном стринг унос 182 00:11:19,360 --> 00:11:23,810 који је прецоннецтед улазни канал који се користи за пренос улаз корисников 183 00:11:23,810 --> 00:11:26,270 од терминала до програма. 184 00:11:26,270 --> 00:11:29,890 >> Кад год корисник упише у нови лик, ми смо проверили да ли је индекс 185 00:11:29,890 --> 00:11:35,810 од следећег слободног слота, плус 1 је већи од капацитета бафера. 186 00:11:35,810 --> 00:11:39,690 Тхе +1 долази у, јер ако је следећи слободан индекс 5, 187 00:11:39,690 --> 00:11:44,150 Онда је наш Буффер је дужина мора да буде 6 захваљујући 0 индексирање. 188 00:11:44,150 --> 00:11:48,350 Ако смо понестане простора у баферу, онда ћемо покушати да га промените величину, 189 00:11:48,350 --> 00:11:51,690 удвостручење је тако да смо смањи број пута да смо величину 190 00:11:51,690 --> 00:11:54,760 ако корисник куца у заиста дугом низу. 191 00:11:54,760 --> 00:11:57,950 Уколико стринг је стечен предуго или ако понестане хеап меморије, 192 00:11:57,950 --> 00:12:01,350 ослободимо нашу бафер и повратка нулл. 193 00:12:01,350 --> 00:12:04,170 >> Коначно, можемо додати знак у бафер. 194 00:12:04,170 --> 00:12:08,200 Када корисник уђе хитова или вратити, сигнализирајући нову линију, 195 00:12:08,200 --> 00:12:12,050 или специјални карактер - контрола д - који означава крај улаза, 196 00:12:12,050 --> 00:12:16,240 ми чек да видим да ли корисник заиста уписали у било уопште. 197 00:12:16,240 --> 00:12:18,820 Ако не, враћамо нулл. 198 00:12:18,820 --> 00:12:22,280 Иначе, јер наш бафер је вероватно већа него што нам је потребно, 199 00:12:22,280 --> 00:12:24,830 У најгорем случају то је скоро дупло већа од морамо 200 00:12:24,830 --> 00:12:27,830 јер смо два пута сваки пут кад промените величину, 201 00:12:27,830 --> 00:12:31,840 правимо нову копију стринга помоћу само количину простора који нам је потребан. 202 00:12:31,840 --> 00:12:34,220 Ми додајемо додатни 1 до маллоц позив, 203 00:12:34,220 --> 00:12:37,810 тако да постоји простор за специјалне нулте ТЕРМИНАТОР карактера - \ 0, 204 00:12:37,810 --> 00:12:41,990 које смо додати на ниску када смо копирали у осталим ликовима, 205 00:12:41,990 --> 00:12:45,060 коришћењем стрнцпи уместо стрцпи 206 00:12:45,060 --> 00:12:48,830 тако да можемо навести тачно колико слова желимо да копирате. 207 00:12:48,830 --> 00:12:51,690 Стрцпи копира док не удари у \ 0. 208 00:12:51,690 --> 00:12:55,740 Онда смо ослободили наш бафер и враћа копију позиваоца. 209 00:12:55,740 --> 00:12:59,840 >> Ко је знао такав једноставан привидна функција може бити толико компликовано? 210 00:12:59,840 --> 00:13:02,820 Сада знате шта иде у ЦС50 библиотеци. 211 00:13:02,820 --> 00:13:06,470 >> Моје име је Нејт Хардисон, а ово је ЦС50. 212 00:13:06,470 --> 00:13:08,350 [ЦС50.ТВ]