1 00:00:00,000 --> 00:00:02,760 [Powered by Google Translate] [Недела 5] 2 00:00:02,760 --> 00:00:04,760 [Дејвид Џ Malan, Универзитетот Харвард] 3 00:00:04,760 --> 00:00:11,990 [Ова е CS50.] [CS50.TV] 4 00:00:11,990 --> 00:00:17,780 [Жена] Тој лежи, околу што, не знам. 5 00:00:17,780 --> 00:00:20,300 [Човекот] Значи она што го знаеме ова? 6 00:00:20,300 --> 00:00:24,120 [Жена] Тоа во 09:15, Реј Santoya беше на банкомат. 7 00:00:24,120 --> 00:00:27,420 [Човекот] Значи, прашањето е, што правел во 09:16? 8 00:00:27,420 --> 00:00:29,980 [Жена] Снимањето на 9 мм во нешто. 9 00:00:29,980 --> 00:00:31,900 Можеби виде снајперист. 10 00:00:31,900 --> 00:00:34,000 [Човекот] Или тој работи со него. 11 00:00:34,000 --> 00:00:36,330 [Жена] Чекај. Вратете се назад едно. 12 00:00:36,330 --> 00:00:38,330 [Човекот] Што гледате? 13 00:00:38,330 --> 00:00:44,520 [♫ напнато музика ♫] 14 00:00:44,520 --> 00:00:48,320 [Жена] Донеси лицето нагоре. Цел екран. 15 00:00:48,320 --> 00:00:51,230 [Човекот] очилата. >> Има рефлексија. 16 00:00:51,230 --> 00:01:00,810 [♫ напнато музика ♫] 17 00:01:00,810 --> 00:01:03,580 [Човекот] Тоа е безбол тим Nuevita е. Тоа е нивното лого. 18 00:01:03,580 --> 00:01:07,790 [Жена] И тој зборува за секој кој е облечен дека јакна. 19 00:01:07,790 --> 00:01:13,730 >> [Дејвид Malan] Значи, ова е CS50 недела 5, а денес ние го уништи малку на телевизија и филм за вас. 20 00:01:13,730 --> 00:01:16,170 Значи секогаш кога ќе гледате шоу како овој овде, 21 00:01:16,170 --> 00:01:19,910 и полицајци велат дека "може да се чисти кои се?" или "Подобрување" 22 00:01:19,910 --> 00:01:21,900 не постои подобрување во реалниот свет. 23 00:01:21,900 --> 00:01:25,220 Всушност, она што навистина се е малку нешто како ова. 24 00:01:25,220 --> 00:01:27,570 Сум го зафрла еден од вработените фотографии од страната. 25 00:01:27,570 --> 00:01:30,980 Ова е програма наречена Фотошоп. Ова е 1 од 2 Bowdens, 26 00:01:30,980 --> 00:01:36,300 1 од 3 Bowdens всушност, денес, бидејќи имаме г-ѓа Бауден тука, како и со Роб и Павле. 27 00:01:36,300 --> 00:01:41,950 Но, тука е Роб на екранот, и ако зумирате на кои трепкаат тој секогаш имаше во неговите очи, 28 00:01:41,950 --> 00:01:47,600 она што всушност се види е дека она што го гледате е она што го добивате. 29 00:01:47,600 --> 00:01:51,690 Ова е "подобрена", па "CSI" имаат малку погрешно. 30 00:01:51,690 --> 00:01:55,190 Има една друга клип, ако можеме да ги собереш на "CSI" само малку подолго. 31 00:01:55,190 --> 00:01:58,500 Ова е еден убав фраза да ја изговори отсега ако сакате да 32 00:01:58,500 --> 00:02:10,280 звук технички се со вашите пријатели кога, навистина, ти си велејќи дека апсолутно ништо. 33 00:02:10,280 --> 00:02:12,970 >> [Човекот] Со недели сум бил истражување на Cabby убиец убиства 34 00:02:12,970 --> 00:02:15,360 со одреден морбидно фасцинација. 35 00:02:15,360 --> 00:02:17,160 [Жена # 1] Ова е во реално време. 36 00:02:17,160 --> 00:02:22,930 [Жена # 2] Јас ќе создаде GUI интерфејс со користење на Visual Basic, да видам дали можам да ги пратите IP адреса. 37 00:02:22,930 --> 00:02:29,570 >> [Malan] Значи аудио надвор од синхронизирате настрана, создавајќи GUI интерфејс со користење на Visual Basic 38 00:02:29,570 --> 00:02:31,820 да ги пратите IP адреса е целосна глупост. 39 00:02:31,820 --> 00:02:33,840 Овие денови не ќе го користи Visual Basic, 40 00:02:33,840 --> 00:02:38,920 нема потреба за GUI, и IP адресата е технички точни мандат. 41 00:02:38,920 --> 00:02:41,730 Па да се внимава од за нив, и еден од моите омилени: 42 00:02:41,730 --> 00:02:45,070 Оваа една е малку повеќе таинствени, затоа што треба да се знае на друг јазик. 43 00:02:45,070 --> 00:02:47,860 Има еден јазик се нарекува Objective-C, која е superset на В 44 00:02:47,860 --> 00:02:51,960 Што значи тоа е C плус некои дополнителни функции, меѓу нив и објектно-ориентираното програмирање. 45 00:02:51,960 --> 00:02:55,070 И ова е јазикот на кој Епл ја популаризира за iOS програмирање. 46 00:02:55,070 --> 00:02:58,760 И така тука е сцена од различни шоу целосно, од "броеви" 47 00:02:58,760 --> 00:03:02,450 дека ако навистина се погледне одблизу на вашиот TiVo и пауза во вистински момент, 48 00:03:02,450 --> 00:03:07,700 ќе видите дека она што го барате не е сосема она што се опишува. 49 00:03:07,700 --> 00:03:11,170 И дозволете ми да се обиде на различни аудио приклучок тука и да видиме ако не можеме да 50 00:03:11,170 --> 00:03:13,780 задржи на аудио во синхронизација тоа време. 51 00:03:13,780 --> 00:03:20,530 Јас ви даде "броеви". 52 00:03:20,530 --> 00:03:23,240 >> [Човекот # 1] Тоа е 32-битен IPv4 адреса. 53 00:03:23,240 --> 00:03:38,930 [Човекот # 2] IP адреса, тоа е на интернет. >> Приватна мрежа. Тоа е приватна мрежа на Anita. 54 00:03:38,930 --> 00:03:43,810 [Malan] Во ред. Ова е Objective-C, а тоа е за боење програма некои детски, 55 00:03:43,810 --> 00:03:51,140 како што можеби може да заклучиме од името на променливата таму. 56 00:03:51,140 --> 00:03:54,410 Така што, тогаш, е "броеви". Така, денес и оваа недела ќе се воведат 57 00:03:54,410 --> 00:03:57,740 малку на светот на криминолошки науки и контекстот во проблеми поради тоа. 58 00:03:57,740 --> 00:04:00,590 Денес ќе биде скратен предавање бидејќи има специјален настан во тука 59 00:04:00,590 --> 00:04:05,530 потоа, па ние ќе се погледнеме и душманке и учениците и родителите, така и денес 60 00:04:05,530 --> 00:04:07,420 со некои од работите кои се на хоризонтот. 61 00:04:07,420 --> 00:04:12,240 Меѓу нив, од понеделник, ќе имате уште неколку соученици. 62 00:04:12,240 --> 00:04:16,050 Edx, Харвард и mits нова онлајн иницијатива за отворени курсеви 63 00:04:16,050 --> 00:04:19,120 и повеќе, е подигнувањето на кампусот на Харвард во понеделникот. 64 00:04:19,120 --> 00:04:21,490 Што значи дојде понеделник ќе имаат - како на последно брои, 65 00:04:21,490 --> 00:04:26,210 86.000 дополнителни соученици ќе бидат следниве заедно со предавања CS50 е 66 00:04:26,210 --> 00:04:29,170 и секции и walkthroughs и проблемот комплети. 67 00:04:29,170 --> 00:04:32,350 И како дел од ова, ќе станат членки на инаугуративната класа на 68 00:04:32,350 --> 00:04:35,090 CS50 и сега CS50x. 69 00:04:35,090 --> 00:04:39,310 >> Како дел од ова, сега, свесни дека ќе има некои квит, како и. 70 00:04:39,310 --> 00:04:43,790 Да се ​​подготвени за тоа, за голем број на студенти, 71 00:04:43,790 --> 00:04:47,180 доволно е да се каже дека иако имаме 108 TFS и CAS, 72 00:04:47,180 --> 00:04:50,790 не е сосема најдобар ученик / наставник сооднос еднаш сме го погоди 80.000 други студенти. 73 00:04:50,790 --> 00:04:52,850 Па ние нема да се оценување толку многу проблем поставува рачно. 74 00:04:52,850 --> 00:04:55,920 Значи воведе оваа недела во проблемот собата ќе биде CS50 Проверете, 75 00:04:55,920 --> 00:04:58,450 која ќе биде командната линија за комунални услуги во рамките на апаратот 76 00:04:58,450 --> 00:05:01,200 дека ќе добиете откако ќе го ажурирате подоцна овој викенд, 77 00:05:01,200 --> 00:05:03,200 и ќе бидете во можност да извршите команда, проверете 50, 78 00:05:03,200 --> 00:05:06,500 на свој pset, и ќе добиете некои повратни информации за тоа дали вашата програма е 79 00:05:06,500 --> 00:05:11,160 точни или неточни според различни спецификации за дизајнот што се предвидени. 80 00:05:11,160 --> 00:05:13,580 Па повеќе за тоа и проблемот сет спецификација и 81 00:05:13,580 --> 00:05:17,240 на CS50x соученици ќе биде со користење на овој, како и. 82 00:05:17,240 --> 00:05:19,230 >> Значи проблемот сет 4 е за сите науки. 83 00:05:19,230 --> 00:05:21,940 И ова парче бил инспириран од некои реални нешта, 84 00:05:21,940 --> 00:05:24,620 при што, кога бев во дипломиран училиште, јас интерниран за некое време со 85 00:05:24,620 --> 00:05:28,650 Канцеларијата Middlesex Каунти Окружниот правобранителство прави форензичар работа 86 00:05:28,650 --> 00:05:31,650 со олово форензичар иследник, и што тоа изнесува 87 00:05:31,650 --> 00:05:35,260 е, мислам дека јас спомнав изминатите неколку недели, е масовно држава полицијата или другите 88 00:05:35,260 --> 00:05:39,000 ќе дојдат, тие ќе заспивам работи како хард дискови и компакт дискови и дискети 89 00:05:39,000 --> 00:05:42,340 и слично, а потоа целта на криминолошки науки канцеларија беше да се утврди дали 90 00:05:42,340 --> 00:05:44,600 имало или не беше доказ на некој вид. 91 00:05:44,600 --> 00:05:48,010 Ова беше специјални истраги единица, па тоа беше чиновнически криминал, 92 00:05:48,010 --> 00:05:52,350 тоа беше повеќе вознемирувачки вид на кривични дела, 93 00:05:52,350 --> 00:05:55,990 ништо вклучуваат некој вид на дигиталните медиуми, излегува дека не дека многу луѓе 94 00:05:55,990 --> 00:05:59,370 напишете е-маил велејќи: "Јас го направив тоа." 95 00:05:59,370 --> 00:06:03,290 Па доста често овие криминолошки науки пребарувања не се претвори до сите дека многу овошје, 96 00:06:03,290 --> 00:06:05,850 но понекогаш луѓето ќе пишуваат такви пораки. 97 00:06:05,850 --> 00:06:08,490 Па понекогаш напори беа наградени. 98 00:06:08,490 --> 00:06:14,420 >> Но да се доведе до оваа судска pset, ќе биде воведување во pset 4 малку графика. 99 00:06:14,420 --> 00:06:18,260 Па најверојатно ги преземат овие нешта здраво за готово, JPEG слики, GIFs и слично овие денови, 100 00:06:18,260 --> 00:06:21,640 но ако навистина мислиш за тоа, слика, слично како лице на Rob, 101 00:06:21,640 --> 00:06:24,430 може да се моделираат како низа од точки, или пиксели. 102 00:06:24,430 --> 00:06:26,680 Сега, во случај на лицето на Rob, има сите видови на бои, 103 00:06:26,680 --> 00:06:29,940 и почнавме да ја видите поединечни точки, otherwide познати како пиксели, 104 00:06:29,940 --> 00:06:31,610 еднаш почнавме да зумирате внатре 105 00:06:31,610 --> 00:06:35,590 Но, ако ги поедностави светот малку, и само велат дека ова тука е Rob 106 00:06:35,590 --> 00:06:40,560 во црно и бело, добро, да ги претставуваат црна и бела ние само може да се користи бинарни. 107 00:06:40,560 --> 00:06:44,960 И ако ние се случува да се користи бинарни, 1 или 0, можеме да ги изразат оваа иста слика 108 00:06:44,960 --> 00:06:51,970 на насмеано лице Rob со овој модел на битови: 11000011 претставува 109 00:06:51,970 --> 00:06:55,160 бела, бела, црна, црна, црна, црна, бела бела боја. 110 00:06:55,160 --> 00:06:59,290 И така тоа не е огромен скок, а потоа, да почнам да зборувам за шарени фотографии. 111 00:06:59,290 --> 00:07:01,920 Работи што ќе видите на Фејсбук или се со дигитална камера, 112 00:07:01,920 --> 00:07:04,730 но, секако, кога станува збор за боите, ви треба повеќе битови. 113 00:07:04,730 --> 00:07:08,470 И доста честа појава во светот на фотографии е да се користи не 1-bit-на боја, 114 00:07:08,470 --> 00:07:12,730 како ова сугерира, но 24-битна боја, каде што всушност милиони бои. 115 00:07:12,730 --> 00:07:15,430 Така што кога ќе зумира во на око на Rob во случајот, 116 00:07:15,430 --> 00:07:19,270 тоа беше било кој број на милиони различни шарени можности. 117 00:07:19,270 --> 00:07:22,260 >> Па ние ќе се воведе ова проблем сет 4, како и во Walkthrough, 118 00:07:22,260 --> 00:07:27,050 кој ќе биде денес во 03:30 наместо вообичаените 02:30 поради предавање во петокот тука. 119 00:07:27,050 --> 00:07:29,930 Но, на видео ќе биде онлајн, како и обично, утре. 120 00:07:29,930 --> 00:07:31,880 Ние исто така ќе ве запознаам со друг формат на датотека. 121 00:07:31,880 --> 00:07:34,150 Значи ова е намерно со цел да изгледа застрашувачки на прв, 122 00:07:34,150 --> 00:07:38,980 но ова е само некоја документација за struct Ц. 123 00:07:38,980 --> 00:07:42,280 Излегува дека Мајкрософт, пред неколку години, помогна во промовирањето на овој формат, 124 00:07:42,280 --> 00:07:46,630 наречен bitmap формат на датотека, BMP, и ова е супер-едноставни, 125 00:07:46,630 --> 00:07:50,390 шарени графички формат на датотека која се користи за сосема извесно време 126 00:07:50,390 --> 00:07:53,640 а понекогаш уште за позадини за десктоп компјутерите. 127 00:07:53,640 --> 00:07:57,410 Ако мислите назад на Windows XP и ридови и сино небо, 128 00:07:57,410 --> 00:08:00,660 тоа беше обично BMP, или bitmap слика, и bitmaps 129 00:08:00,660 --> 00:08:03,340 се забавуваат за нас, бидејќи тие имаат малку повеќе комплексност. 130 00:08:03,340 --> 00:08:05,640 Тоа не е толку едноставно како ова решетка од 0 и 1 е; 131 00:08:05,640 --> 00:08:10,680 наместо тоа, имаш работи како насловот на почетокот на датотека. 132 00:08:10,680 --> 00:08:15,520 Значи со други зборови, во внатрешноста на. BMP датотека е целиот куп на 0 и 1 е, 133 00:08:15,520 --> 00:08:18,070 но има некои дополнителни 0 и 1 во таму. 134 00:08:18,070 --> 00:08:21,450 И излегува дека она што веројатно зема здраво за готово со години, 135 00:08:21,450 --> 00:08:27,040 формати на датотеки како. doc или. xls или. mp3 или. Mp4, 136 00:08:27,040 --> 00:08:29,910 без оглед на формати на датотеки кои сте запознаени со. 137 00:08:29,910 --> 00:08:31,900 Па, она што е дури и значи да се биде формат на датотека? 138 00:08:31,900 --> 00:08:35,740 Бидејќи на крајот на денот, сите овие датотеки ние ги користиме имаат само 0 и 1 е 139 00:08:35,740 --> 00:08:39,950 а можеби и оние 0 и 1 ги претставува, б, в, преку ASCII или слично, 140 00:08:39,950 --> 00:08:42,030 но до крајот на денот, тоа е само 0 и 1 е. 141 00:08:42,030 --> 00:08:45,300 >> Значи луѓето само повремено одлучи да измисли нов формат на датотека 142 00:08:45,300 --> 00:08:49,420 каде што се стандардизира какви модели на битови, всушност, ќе значи. 143 00:08:49,420 --> 00:08:52,790 И во овој случај тука, на луѓе кои дизајниран bitmap формат на датотека 144 00:08:52,790 --> 00:08:58,260 рече дека во првиот бајт во битмапа датотеки, како означува со офсет 0, таму, 145 00:08:58,260 --> 00:09:02,320 таму ќе биде некои cryptically име променлива наречена bfType, 146 00:09:02,320 --> 00:09:06,510 кои само се залага за bitmap тип на датотека, каков тип на bitmap датотека е оваа. 147 00:09:06,510 --> 00:09:10,780 Можете да заклучиме, можеби, од вториот ред што офсет 2, бајт број 2, 148 00:09:10,780 --> 00:09:15,980 има модел на 0 и 1 дека претставува она? 149 00:09:15,980 --> 00:09:18,320 Големината на нешто, и тоа оди од таму. 150 00:09:18,320 --> 00:09:20,660 Значи во проблем сет 4, ќе се одеше преку некои од овие работи. 151 00:09:20,660 --> 00:09:24,480 >> Ние нема да заврши се грижат за сите од нив, но забележите тоа ќе почне да се интересни 152 00:09:24,480 --> 00:09:30,780 околу линија или бајт 54, rgbtBlue, зелена и црвена. 153 00:09:30,780 --> 00:09:35,280 Ако некогаш сте слушнале акроним RGB, црвени зелени сини, ова е референца за тоа. 154 00:09:35,280 --> 00:09:37,840 Поради тоа што излегува можете да наслика сите бои на виножитото 155 00:09:37,840 --> 00:09:41,580 со некоја комбинација од сина и црвена и зелена боја. 156 00:09:41,580 --> 00:09:46,560 И, всушност, родителите во собата може да се потсетиме на некои од најраните проектори. 157 00:09:46,560 --> 00:09:49,360 Овие денови, можете само да видите 1 светлина излегува на објективот. 158 00:09:49,360 --> 00:09:52,870 Но, во тоа време, сте имале црвена леќа, сини леќи, и зелени леќа 159 00:09:52,870 --> 00:09:56,620 и заедно во насока на екранот и формираше шарени сликата. 160 00:09:56,620 --> 00:09:59,590 И доста често средните училишта и средните училишта ќе имаат оние леќи 161 00:09:59,590 --> 00:10:02,680 некогаш толку малку askew, па сте биле вид на гледање двоен или троен слики, 162 00:10:02,680 --> 00:10:07,500 но тоа беше идејата. Сте имале црвена и зелена и сина светлина сликарство слика. 163 00:10:07,500 --> 00:10:09,570 И дека истиот принцип се користи во компјутерите. 164 00:10:09,570 --> 00:10:12,000 >> Значи меѓу предизвици, а потоа, за вас во проблемот постави 4 165 00:10:12,000 --> 00:10:16,080 ќе бидат неколку нешта, еден е всушност менување на големината на сликата. 166 00:10:16,080 --> 00:10:18,050 Да се ​​земе во модел на 0 и 1 е, 167 00:10:18,050 --> 00:10:22,840 дознаам што делови од 0 и 1 ги претставува она што во структурата како оваа, 168 00:10:22,840 --> 00:10:26,800 а потоа дознаам како да се реплицираат во пиксели: на црвена, блуз, зелена 169 00:10:26,800 --> 00:10:32,460 внатре, така што кога сликата изгледа вака на почетокот, може да изгледа вака наместо после тоа. 170 00:10:32,460 --> 00:10:35,590 Меѓу другите предизвици, исто така, ќе биде што ќе биде предаден 171 00:10:35,590 --> 00:10:38,900 форензичар сликата на вистински датотека од дигитална камера 172 00:10:38,900 --> 00:10:42,410 и на тој апарат, еднаш многу одамна, беа еден куп фотографии. 173 00:10:42,410 --> 00:10:47,030 Проблемот е, ние случајно избришани или имале сликата расипана некако. 174 00:10:47,030 --> 00:10:51,040 Лоши работи се случуваат со дигитални камери, и така ние брзо копирани сите на 0 и 1 е 175 00:10:51,040 --> 00:10:55,410 на тој картичка за вас, ги спасил сите во 1 голема датотека, а потоа ние ќе им рака за да ви 176 00:10:55,410 --> 00:11:00,000 во проблемот постави 4, така што ќе може да напише програма во C со што да се опорави 177 00:11:00,000 --> 00:11:02,660 сите оние JPEG слики, идеално. 178 00:11:02,660 --> 00:11:06,280 И излегува дека JPEG слики, иако тие се малку на комплексни формат на датотека, 179 00:11:06,280 --> 00:11:09,580 тие се многу посложени од тоа насмеано лице тука. 180 00:11:09,580 --> 00:11:14,320 Излегува дека секој JPEG започнува со истите модели на 0 и 1 е. 181 00:11:14,320 --> 00:11:18,820 Значи со користење додека јамка или за телефонска линија или слично, 182 00:11:18,820 --> 00:11:22,350 можете да iterate во текот на сите 0 и 1 во оваа судска сликата 183 00:11:22,350 --> 00:11:26,670 и секој пат кога ќе видите специјална шема, која е дефинирана во спецификацијата на проблемот во собата, 184 00:11:26,670 --> 00:11:29,770 може да се претпостави, "Ах, тука е, со многу голема веројатност, 185 00:11:29,770 --> 00:11:33,520 почетокот на JPEG, 'и веднаш штом ќе ги најдете на иста шема, 186 00:11:33,520 --> 00:11:36,050 некои број на бајти или kilobytes или мегабајти подоцна, 187 00:11:36,050 --> 00:11:40,550 може да се претпостави, "Ooh! Тука е вториот JPEG, фото отидов по првиот. 188 00:11:40,550 --> 00:11:44,720 Дозволете ми да престане читањето дека првиот фајл, почнете со пишување на овој нов. " 189 00:11:44,720 --> 00:11:49,980 И излез на вашата програма за pset 4 ќе биде колку што е 50 JPEG слики. 190 00:11:49,980 --> 00:11:52,400 И ако тоа не е 50 JPEG слики, имате малку на јамка. 191 00:11:52,400 --> 00:11:55,580 Ако имате неограничен број на JPEG слики, имаш бесконечна јамка. 192 00:11:55,580 --> 00:11:58,280 Така што, исто така, ќе биде доста чест случај. 193 00:11:58,280 --> 00:12:00,280 Тоа е она што е на хоризонтот. 194 00:12:00,280 --> 00:12:03,740 >> Квиз 0, зад нас. Реализира, на мојот е-мејл, дека секогаш има луѓе 195 00:12:03,740 --> 00:12:06,820 кои се истовремено среќни, сортирање на неутрални и тажни околу квиз 0 време. 196 00:12:06,820 --> 00:12:10,160 И немојте да допрат до мене, шеф TFS, Zamyla, свој ТФ 197 00:12:10,160 --> 00:12:14,120 или еден од Кас дека знаете ако би сакале да разговараат за тоа како се одвиваа работите. 198 00:12:14,120 --> 00:12:16,460 >> Така да импресионира родители тука во собата, 199 00:12:16,460 --> 00:12:23,990 што е CS50 библиотека? Добра работа. 200 00:12:23,990 --> 00:12:32,280 Што е CS50 библиотека? Да? [Студентски одговори, неразбирливо] 201 00:12:32,280 --> 00:12:35,730 >> Океј, добро. Па тоа е prewritten сет на кодот кој ние, вработените, пишува, 202 00:12:35,730 --> 00:12:38,460 ние обезбеди за вас, да се обезбедат некои заеднички функционалности. 203 00:12:38,460 --> 00:12:42,290 Работи како мене добие стринг; ме добие int, сите функции кои се наведени тука. 204 00:12:42,290 --> 00:12:45,260 Почнувајќи од сега, ние почнуваме да навистина се овие обука тркала надвор. 205 00:12:45,260 --> 00:12:48,230 Па ние ќе почне да потрае "стринг" од вас, 206 00:12:48,230 --> 00:12:52,790 кои потсетиме, беше само синоним за каков тип на податоци? char *. 207 00:12:52,790 --> 00:12:57,020 Така и за родителите, кои, најверојатно, - тоа е добро, па char * ние ќе почнете да ја видите 208 00:12:57,020 --> 00:13:00,810 на екранот сè повеќе и повеќе како што ние ги отстрани "стринг" од нашиот речник, 209 00:13:00,810 --> 00:13:02,760 барем кога станува збор за навистина пишување на код. 210 00:13:02,760 --> 00:13:06,240 Слично на тоа, ние ќе престане да го користи некои од овие функции како многу, 211 00:13:06,240 --> 00:13:08,390 бидејќи нашите програми се случува да добиете повеќе софистицирани 212 00:13:08,390 --> 00:13:11,370 наместо само пишуваат програми кои седат таму со брза трепка, 213 00:13:11,370 --> 00:13:13,580 чекање за корисникот да напишеш нешто внатре 214 00:13:13,580 --> 00:13:15,220 Ќе ја добиете вашата влезови од друго место. 215 00:13:15,220 --> 00:13:18,720 На пример, ќе ги добиете од серија на битови на локален хард диск. 216 00:13:18,720 --> 00:13:23,340 Ти наместо ќе ги добие во иднина од некоја мрежна конекција, некои веб некаде. 217 00:13:23,340 --> 00:13:27,460 Значи, да лупам назад овој слој, за прв пат, а се повлече до CS50 апаратот 218 00:13:27,460 --> 00:13:32,300 и оваа датотека се нарекува CS50.h, кои сте биле остри вклучувајќи недели. 219 00:13:32,300 --> 00:13:34,380 >> Но, ајде да всушност гледаат она што е внатре за тоа. 220 00:13:34,380 --> 00:13:38,250 Така на врвот на датотека во плава е само еден куп на коментарите, 221 00:13:38,250 --> 00:13:41,340 гаранција информации и лиценцирање. Ова е вид на заедничка парадигма 222 00:13:41,340 --> 00:13:44,600 во софтвер, бидејќи многу софтвер овие денови е она што се нарекува "отворен код" 223 00:13:44,600 --> 00:13:46,940 што значи дека некој има напишано код 224 00:13:46,940 --> 00:13:50,060 и го направи слободно достапна, а не само да се кандидира и да се користи, 225 00:13:50,060 --> 00:13:53,660 но всушност читање и менување и да се интегрираат во својата работа. 226 00:13:53,660 --> 00:13:55,790 Значи тоа е она што сте биле користење на софтвер со отворен код, 227 00:13:55,790 --> 00:13:58,030 иако во многу мала форма. 228 00:13:58,030 --> 00:14:01,860 Ако јас дојдете минатото на коментарите, сепак, ќе почнете да видите некои повеќе познати работи. 229 00:14:01,860 --> 00:14:08,090 Значи забележите на врвот тука, дека датотеката CS50.h вклучува целиот куп на насловот датотеки. 230 00:14:08,090 --> 00:14:11,160 Сега, повеќето од овие не сме виделе порано, но едно е 231 00:14:11,160 --> 00:14:15,640 запознаени, што од нив не сме виделе, иако кратко, досега? 232 00:14:15,640 --> 00:14:18,720 Да, стандардни библиотеки. Stdlib.h има Примерок, 233 00:14:18,720 --> 00:14:21,590 па откако почнавме да зборуваме за динамичка меморија распределба, 234 00:14:21,590 --> 00:14:24,960 која ќе се врати на следната недела, како и, почнавме вклучувајќи таа датотека. 235 00:14:24,960 --> 00:14:29,660 Излегува дека bool и вистински и лажни всушност не постои во C, сам по себе, 236 00:14:29,660 --> 00:14:32,460 освен ако не се вклучи оваа датотека тука. 237 00:14:32,460 --> 00:14:35,770 Значи имаме, за неколку недели, е вклучувајќи стандардни bool.h 238 00:14:35,770 --> 00:14:39,020 така што можете да го користите идејата за bool, точно или неточно. 239 00:14:39,020 --> 00:14:41,830 Без ова, вие ќе треба да се најде на лажни и користете int 240 00:14:41,830 --> 00:14:45,920 и само произволно да се претпостави дека 0 е лажна и 1 е вистина. 241 00:14:45,920 --> 00:14:49,980 >> Сега, ако се движите надолу понатаму, тука е нашата дефиниција на стринг. 242 00:14:49,980 --> 00:14:54,820 Излегува, како што рековме порано, дека таму каде што тоа * е не е важно. 243 00:14:54,820 --> 00:14:56,750 Можете дури и да имаат простор наоколу. 244 00:14:56,750 --> 00:15:01,550 Ние, овој семестар, се го промовира како ова да го направи јасно дека * има врска со видот. 245 00:15:01,550 --> 00:15:05,370 Но се реализира, само како заеднички, ако не малку повеќе заеднички, да го стави таму 246 00:15:05,370 --> 00:15:07,480 но функционално тоа е иста работа. 247 00:15:07,480 --> 00:15:11,070 Но, сега, ако читаме долу понатаму, ајде да ги разгледаме во речеме, GetInt, 248 00:15:11,070 --> 00:15:15,350 затоа што се користат, кои, можеби, пред било што друго овој семестар. 249 00:15:15,350 --> 00:15:19,620 И тука е GetInt. Тоа е она? 250 00:15:19,620 --> 00:15:24,650 Ова е прототип. Толку често, имаме стави прототипи на врвот на нашата. В датотеки, 251 00:15:24,650 --> 00:15:28,190 но вие исто така може да се стави прототипови во насловот датотеки. ж датотеки, 252 00:15:28,190 --> 00:15:32,110 како овој овде, така што кога ќе напишам некои функции 253 00:15:32,110 --> 00:15:36,790 што сакате другите луѓе да можат да ги користат, што е точно во случајот со CS50 библиотека, 254 00:15:36,790 --> 00:15:40,900 вие не само спроведување на вашиот функции во нешто како CS50.c, 255 00:15:40,900 --> 00:15:46,720 исто така, се стави на прототипови не на врвот на таа датотека, но на врвот на хедер датотека, 256 00:15:46,720 --> 00:15:50,810 тогаш тоа хедер датотека е она пријатели и колеги вклучуваат, 257 00:15:50,810 --> 00:15:52,800 со остри вклучат во нивните сопствени код. 258 00:15:52,800 --> 00:15:55,440 Значи сето ова време сте биле вклучувајќи ги и сите на овие прототипови 259 00:15:55,440 --> 00:15:59,870 ефикасно на врвот на вашата датотека, но по пат на овој остар вклучуваат механизам 260 00:15:59,870 --> 00:16:03,320 што во суштина копии и пасти оваа датотека во вашиот сопствен. 261 00:16:03,320 --> 00:16:06,400 Сега, тука е некои прилично детални документација. 262 00:16:06,400 --> 00:16:08,880 >> Ние сме доста зема здраво за готово дека GetInt добива int, 263 00:16:08,880 --> 00:16:10,740 но излегува дека е некој агол случаи, нели? 264 00:16:10,740 --> 00:16:14,320 Што се случува ако корисник видови во број кој е премногу голема? 265 00:16:14,320 --> 00:16:17,350 А quintillion, дека едноставно не може да се вклопи во внатрешноста на int? 266 00:16:17,350 --> 00:16:21,180 Кое е очекуваното однесување? Па, идеално, тоа е предвидлив. 267 00:16:21,180 --> 00:16:23,460 Значи во овој случај, ако навистина го прочитате парична казна печати, 268 00:16:23,460 --> 00:16:27,850 ќе видите дека ако линијата не може да се чита, тоа се враќа INT_MAX. 269 00:16:27,850 --> 00:16:30,800 Ние никогаш не сум зборуваше за ова, но врз основа на неговата капитализација, 270 00:16:30,800 --> 00:16:33,030 што е тоа, веројатно? 271 00:16:33,030 --> 00:16:36,610 Тоа е постојана, па тоа е некои посебни константа што е веројатно прогласи 272 00:16:36,610 --> 00:16:39,460 во една од тие насловот датотеки што е горе високо во датотека, 273 00:16:39,460 --> 00:16:43,400 и INT_MAX е веројатно нешто како, грубо, 2 милијарди долари. 274 00:16:43,400 --> 00:16:48,160 Идејата е дека бидејќи ние мораме некако да значи дека нешто не беше во ред, 275 00:16:48,160 --> 00:16:51,090 ние, да, има 4 милијарди броеви на располагање, 276 00:16:51,090 --> 00:16:53,980 негативни 2 милијарди на до 2 милијарди долари, или дава да потрае. 277 00:16:53,980 --> 00:16:58,030 Па, што е честа појава во програмирање е да украдат само еден од тие бројки. 278 00:16:58,030 --> 00:17:02,250 Можеби 0, можеби 2 милијарди, можеби негативни 2 милијарди долари. 279 00:17:02,250 --> 00:17:06,720 Така да поминат една од вашите можни вредности, така што ќе можат да се посветат на светот 280 00:17:06,720 --> 00:17:10,089 дека ако нешто тргне наопаку, ќе се вратам овој супер-голема вредност. 281 00:17:10,089 --> 00:17:13,329 Но, вие не сакате на корисникот пишување нешто криптичната како "2, 3, 4 ..." 282 00:17:13,329 --> 00:17:17,079 на навистина голем број, каде што се генерализира, наместо како константа. 283 00:17:17,079 --> 00:17:19,380 Значи, навистина, ако сте биле тоа анален изминатите неколку недели, 284 00:17:19,380 --> 00:17:23,800 во секое време ви се јави GetInt, треба да се проверува со доколку состојба. 285 00:17:23,800 --> 00:17:27,109 Дали корисникот тип во INT_MAX, или поконкретно, 286 00:17:27,109 --> 00:17:29,900 не GetInt враќање INT_MAX? Затоа што ако тоа го правеше, 287 00:17:29,900 --> 00:17:35,140 што всушност значи дека тие не го напишеш, нешто не беше во ред во овој случај. 288 00:17:35,140 --> 00:17:38,970 Значи тоа е она што е општо познато како "стража" вредност, која едноставно значи посебно. 289 00:17:38,970 --> 00:17:41,020 >> Па, ајде сега се претвори во на. В датотеки. 290 00:17:41,020 --> 00:17:44,500 На датотеката C постои во апаратот за некое време, 291 00:17:44,500 --> 00:17:47,540 и, всушност, апаратот го има прекомпилиран за вас 292 00:17:47,540 --> 00:17:49,720 во тоа нешто што се нарекува "објектен код" 293 00:17:49,720 --> 00:17:52,940 но тоа едноставно не е важно за вас, каде што тоа е затоа што системот знае, 294 00:17:52,940 --> 00:17:54,780 во овој случај, таму каде што е апаратот. 295 00:17:54,780 --> 00:18:00,620 Но, ајде да дојдете долу сега да GetInt, и да видиме како GetInt работи сето ова време. 296 00:18:00,620 --> 00:18:02,380 Значи тука имаме слични коментари од порано. 297 00:18:02,380 --> 00:18:04,930 Дозволете ми да зумирате на само кодот дел, 298 00:18:04,930 --> 00:18:07,410 и она што го имаме за GetInt е следниот. 299 00:18:07,410 --> 00:18:12,770 Тоа не носи влез и го враќа int, додека (вистинска), па ние имаме намерно бесконечна јамка 300 00:18:12,770 --> 00:18:16,560 но, најверојатно, ќе се пробие на ова некако, или да се вратат од рамките ова. 301 00:18:16,560 --> 00:18:19,890 Да видиме како тоа функционира. Па, како да ја користите GetString 302 00:18:19,890 --> 00:18:22,550 во оваа прва линија во внатрешноста на јамка, 166. 303 00:18:22,550 --> 00:18:25,320 Ова е сега добра практика, бидејќи под какви околности 304 00:18:25,320 --> 00:18:30,820 GetString може да се врати оваа специјална клучни зборови, NULL? 305 00:18:30,820 --> 00:18:38,460 Ако нешто тргне наопаку. Што би можело да тргне наопаку кога ќе се јавите нешто како GetString? 306 00:18:38,460 --> 00:18:42,550 Да? [Студентски одговор, неразбирливо] >> Да. Па можеби Примерок не успее. 307 00:18:42,550 --> 00:18:45,310 Некаде под хауба GetString повикува Примерок, 308 00:18:45,310 --> 00:18:48,210 која доделува меморија, која им овозможува на компјутер продавница 309 00:18:48,210 --> 00:18:50,950 сите карактери кои на корисникот видови во тастатурата. 310 00:18:50,950 --> 00:18:53,270 И да претпоставиме на корисникот имаше едночудо слободно време 311 00:18:53,270 --> 00:18:56,470 и внесе повеќе, на пример, од 2 милијарди карактери. 312 00:18:56,470 --> 00:18:59,600 Повеќе ликови од компјутер дури има и RAM меморија. 313 00:18:59,600 --> 00:19:02,350 Па, GetString мора да биде во можност да значи дека до вас, 314 00:19:02,350 --> 00:19:05,650 дури и ако тоа е супер, супер е невообичаено агол случај. 315 00:19:05,650 --> 00:19:08,490 Таа има некако да биде во можност да се справи со тоа, и така GetString, 316 00:19:08,490 --> 00:19:11,850 ако ние одиме назад и да прочитате неговата документација, не, всушност, се врати NULL. 317 00:19:11,850 --> 00:19:16,150 Сега ако GetString не со враќање NULL, GetInt се случува да не успее 318 00:19:16,150 --> 00:19:19,370 со враќање INT_MAX, само како стража. 319 00:19:19,370 --> 00:19:22,650 Овие се само човечките конвенции. Единствениот начин ќе знаете ова е случај 320 00:19:22,650 --> 00:19:24,840 е со читање на документација. 321 00:19:24,840 --> 00:19:28,200 Па ајде дојдете до местото каде што int е всушност GotInt. 322 00:19:28,200 --> 00:19:34,220 >> Значи, ако јас движете надолу малку понатаму, во согласност 170 имаме коментар над овие линии. 323 00:19:34,220 --> 00:19:38,470 Па ние да изјави, во 172, е int n и знак в, а потоа оваа нова функција 324 00:19:38,470 --> 00:19:41,870 што некои од вас имате тетеравеше низ порано, но sscanf. 325 00:19:41,870 --> 00:19:44,190 Ова се залага за низа скенирање ѓ. 326 00:19:44,190 --> 00:19:48,580 Со други зборови, дај ми низа и јас ќе го скенира за парчиња на информации од интерес. 327 00:19:48,580 --> 00:19:53,820 Значи она што значи тоа? Па, претпоставувам дека јас напишете буквално 1 2 3 на тастатурата, 328 00:19:53,820 --> 00:19:59,730 а потоа притиснете ентер. Што е податоци за видот на 1 2 3 кога се вратија од GetString? 329 00:19:59,730 --> 00:20:05,010 Тоа е очигледно низа, нели? Добив стринг, па 1 2 3 е навистина "1 2 3" 330 00:20:05,010 --> 00:20:07,260 со \ 0 на крајот од неа. Тоа не е int. 331 00:20:07,260 --> 00:20:10,420 Тоа не е број. Тоа изгледа како број, но тоа не е всушност. 332 00:20:10,420 --> 00:20:14,680 Значи она што не GetInt треба да направите? Тоа мора да го скенира дека низа од лево кон десно, 333 00:20:14,680 --> 00:20:19,010 1 2 3 \ 0, и некако го претворат во вистински број. 334 00:20:19,010 --> 00:20:21,010 Сега, можете да дознаам како да го направите тоа. 335 00:20:21,010 --> 00:20:24,240 Ако мислите назад кон pset 2, веројатно добија малку удобно 336 00:20:24,240 --> 00:20:26,810 со Цезар или vigenere па можете да iterate во текот на еден стринг, 337 00:20:26,810 --> 00:20:29,800 можете да ги конвертирате карактери да ints со мотиката. Тоа е целина многу работа. 338 00:20:29,800 --> 00:20:32,800 Зошто да не се јавите на функција како sscanf дека прави тоа за вас? 339 00:20:32,800 --> 00:20:37,520 Значи sscanf очекува аргумент, во овој случај се нарекува линија, која е стринг. 340 00:20:37,520 --> 00:20:41,310 Тогаш наведете, во наводници, многу слични на printf, 341 00:20:41,310 --> 00:20:44,960 што очекувате да се види во оваа низа? 342 00:20:44,960 --> 00:20:52,980 Што сакам да кажам дека тука е, очекувам да видам децимален број, а можеби и карактер. 343 00:20:52,980 --> 00:20:54,990 И ќе видиме зошто ова е случај во само еден миг. 344 00:20:54,990 --> 00:20:58,440 Излегува дека оваа нотација е сега потсетува на нешто 345 00:20:58,440 --> 00:21:00,840 почнавме да зборуваме за нешто повеќе од пред една недела. 346 00:21:00,840 --> 00:21:05,430 >> Што е & n и и в прави за нас овде? [Студентски одговори, неразбирливо] 347 00:21:05,430 --> 00:21:07,610 >> Да. Тоа ми даде адресата на n и адреса на в. 348 00:21:07,610 --> 00:21:10,440 Сега, зошто е тоа важно? Па, знаеш дека со функции во C 349 00:21:10,440 --> 00:21:13,440 секогаш може да се врати на вредност или никаква вредност на сите. 350 00:21:13,440 --> 00:21:16,630 Можете да се врати int, стринг, плови, char, сеедно. 351 00:21:16,630 --> 00:21:21,150 Или може да се врати празнина, но вие може само да се врати 1 нешто максимално. 352 00:21:21,150 --> 00:21:26,100 Но тука ние сакаме sscanf да ми се врати можеби еден цел број, децимален број, 353 00:21:26,100 --> 00:21:29,240 а исто така знак, и јас ќе објасни зошто знак во еден момент. 354 00:21:29,240 --> 00:21:34,250 Па можете успешно сакате ѓ да се вратат 2 работи, а тоа не е само можно во C. 355 00:21:34,250 --> 00:21:38,460 Така може да се работи околу тоа со полагање во 2 адреси, 356 00:21:38,460 --> 00:21:43,710 затоа што веднаш штом ќе предаде функција 2 адреси, она што може таа функција се направи со нив? 357 00:21:43,710 --> 00:21:49,880 Тоа може да напише на тие адреси. Можете да ги користите * операција и "одиме таму" за секоја од овие адреси. 358 00:21:49,880 --> 00:21:54,320 Тоа е еден вид на овој задна врата механизам, но многу честа појава за менување на вредностите на променливите 359 00:21:54,320 --> 00:21:58,020 во повеќе од само 1 место, во овој случај 2. 360 00:21:58,020 --> 00:22:04,590 Сега, забележиш јас сум проверка за == to1, а потоа се враќа n, ако тоа се случи, всушност, се оцени на true. 361 00:22:04,590 --> 00:22:09,340 Значи она што се случува? Па, технички, сите ние навистина сакаме да се случи во GetInt е ова. 362 00:22:09,340 --> 00:22:12,340 Ние сакаме да го анализирам, така да се каже, ние сакаме да го прочитате низа 363 00:22:12,340 --> 00:22:16,210 "1 2 3" и ако изгледа има голем број таму, 364 00:22:16,210 --> 00:22:21,360 она што го кажува sscanf да направите е да се стави тој број, 1 2 3, во оваа променлива n за мене. 365 00:22:21,360 --> 00:22:26,060 Зошто, тогаш, никако не можев да ја имаат оваа како? 366 00:22:26,060 --> 00:22:33,750 Која е улогата на, исто така, велејќи sscanf, исто така, може да добијат карактер тука. 367 00:22:33,750 --> 00:22:36,890 [Студентски земено, неразбирливо] >> Не - децимална точка би можеле да работат. 368 00:22:36,890 --> 00:22:40,650 Ајде да се одржи таа мисла за момент. Што друго? 369 00:22:40,650 --> 00:22:42,570 [Студент, неразбирливо] >> Значи, добра мисла, тоа би можело да биде NULL карактер. 370 00:22:42,570 --> 00:22:44,970 Тоа не е всушност, во овој случај. Да? [Студент, неразбирливо] 371 00:22:44,970 --> 00:22:47,100 >> >> ASCII. Или, дозволете ми да се генерализира дури и подалеку. 372 00:22:47,100 --> 00:22:49,670 На% c постои само за грешка проверка. 373 00:22:49,670 --> 00:22:52,510 Ние не сакаме да има карактер по број, 374 00:22:52,510 --> 00:22:54,980 но она што оваа ми дозволува да направите е следново: 375 00:22:54,980 --> 00:23:01,270 Излегува дека sscanf, покрај складирање вредности во n и в, во овој пример тука, 376 00:23:01,270 --> 00:23:08,170 што исто така не е го враќа бројот на променливи го стави вредности внатре 377 00:23:08,170 --> 00:23:13,330 Значи, ако само напишете 1 2 3, тогаш само% d ќе одговара 378 00:23:13,330 --> 00:23:18,830 и само N добива чуваат со вредност како 1 2 3 и ништо не добива стави во C; 379 00:23:18,830 --> 00:23:20,870 в останува ѓубре вредност, така да се каже. 380 00:23:20,870 --> 00:23:23,550 Ѓубре, бидејќи тоа никогаш не била иницијализирана како што некои вредност. 381 00:23:23,550 --> 00:23:29,390 Значи во тој случај, sscanf враќа 1, бидејќи јас населен еден од оние покажувачи, 382 00:23:29,390 --> 00:23:33,650 во кој случај, одлично. Имам int, па јас ослободи линија за да се ослободи меморија 383 00:23:33,650 --> 00:23:37,150 дека GetString всушност распределени, а потоа ќе се вратам n. 384 00:23:37,150 --> 00:23:42,210 Друго, ако некогаш сте се запрашале каде што се обидете повторно изјава доаѓа, доаѓа од овде. 385 00:23:42,210 --> 00:23:45,770 Ако, пак, јас напишете 1 2 3 foo, 386 00:23:45,770 --> 00:23:48,640 само некои случајна секвенца на текст, sscanf се случува да се види, 387 00:23:48,640 --> 00:23:51,500 ooh, број, ooh, број, ooh, број, ooh - ѓ. 388 00:23:51,500 --> 00:23:54,190 И тоа се случува да се стави 1 2 3 во Н. 389 00:23:54,190 --> 00:23:59,970 Тоа се случува да се стави на f во C, а потоа се врати 2. 390 00:23:59,970 --> 00:24:02,980 Значи имаме, само со користење на основните дефиниција на однесување Scanf е, 391 00:24:02,980 --> 00:24:06,170 еден многу едноставен начин - добро, комплекс на прв поглед, но на крајот на денот, 392 00:24:06,170 --> 00:24:11,460 прилично едноставен механизам да се каже, е таму int, и ако е така, е дека единственото нешто што најдов? 393 00:24:11,460 --> 00:24:14,950 И белиот простор тука е намерно. Ако го прочитате документацијата за sscanf, 394 00:24:14,950 --> 00:24:18,690 тоа ви кажува дека ако вклучуваат парче бел простор на почетокот или на крајот, 395 00:24:18,690 --> 00:24:24,990 sscanf исто така ќе им овозможи на корисникот, за која било причина, да ја погоди spacebar 1 2 3, и дека ќе бидат легитимни. 396 00:24:24,990 --> 00:24:28,310 Тоа нема да се развикам на корисникот само затоа што тие хит на spacebar на почетокот или на крајот, 397 00:24:28,310 --> 00:24:32,160 што е само малку повеќе user-friendly. 398 00:24:32,160 --> 00:24:34,160 >> Било какви прашања, а потоа, на GetInts? Да? 399 00:24:34,160 --> 00:24:36,820 [Студентски збор, неразбирливо] 400 00:24:36,820 --> 00:24:40,740 >> Добро прашање. Што ако само ја внеле во знак, како f, и притиснете ентер 401 00:24:40,740 --> 00:24:47,830 без воопшто да пишувате 1 2 3; што мислите однесувањето на оваа линија код, тогаш ќе биде? 402 00:24:47,830 --> 00:24:50,500 Значи sscanf може да ги покрие дека премногу, бидејќи во тој случај, 403 00:24:50,500 --> 00:24:56,280 тоа не се случува да се пополни n или в; тоа се случува да наместо вратат 0. 404 00:24:56,280 --> 00:25:01,540 Во кој случај, јас сум исто така, фаќање на тоа сценарио, бидејќи очекуваната вредност што сакам е 1. 405 00:25:01,540 --> 00:25:07,310 Јас само сакам 1, а само 1 нешто што треба да бидат пополнети. Добро прашање. Другите? 406 00:25:07,310 --> 00:25:09,610 >> Добро, така нека не одат низ сите функции во тука, 407 00:25:09,610 --> 00:25:11,820 но оној кој се чини дека е, можеби, на останатите интерес 408 00:25:11,820 --> 00:25:14,530 е GetString бидејќи излегува дека GetFloat, GetInt, 409 00:25:14,530 --> 00:25:19,490 GetDouble, GetLongLong сите залог многу на нивната функционалност да GetString. 410 00:25:19,490 --> 00:25:22,860 Па ајде да ги разгледаме во тоа како тој се спроведува тука. 411 00:25:22,860 --> 00:25:27,040 Оваа една изгледа малку комплексна, но тоа го користи истиот основи 412 00:25:27,040 --> 00:25:29,680 што почнавме да зборуваме за минатата недела. Значи во GetString, 413 00:25:29,680 --> 00:25:32,670 што се нема аргумент како на празнина се тука, 414 00:25:32,670 --> 00:25:37,110 и враќа стринг, па јас сум прогласување на низа наречен тампон. 415 00:25:37,110 --> 00:25:39,670 Јас навистина не знам што се случува да се користи за уште, но ќе видиме. 416 00:25:39,670 --> 00:25:42,950 Изгледа капацитет е, по дифолт, 0; не се сосема сигурни каде ова се случува. 417 00:25:42,950 --> 00:25:44,920 Не сум сигурен што n се случува да се користи за уште. 418 00:25:44,920 --> 00:25:47,860 Но, сега тоа е добивање малку повеќе интересно, па во согласност 243, 419 00:25:47,860 --> 00:25:51,760 ние прогласи int в, ова е вид на глупави детали. 420 00:25:51,760 --> 00:25:58,080 А знак е 8 бита и 8 битови може да се сместат колку различни вредности? 421 00:25:58,080 --> 00:26:03,310 256. Проблемот е, ако сакате да имате 256 различни ASCII карактери, 422 00:26:03,310 --> 00:26:06,210 кои постојат, ако се сетам, и тоа не е нешто што треба да се запаметат. 423 00:26:06,210 --> 00:26:09,100 Но, ако се сетам на толку голема ASCII табелата имавме недели, 424 00:26:09,100 --> 00:26:13,780 имало, во тој случај, 128 или 256 ASCII карактери. 425 00:26:13,780 --> 00:26:16,220 Ние се користат сите модели на 0 и 1 е до. 426 00:26:16,220 --> 00:26:19,410 Тоа е проблем ако сакате да бидете во можност да детектира грешка. 427 00:26:19,410 --> 00:26:23,290 Затоа што ако веќе сте користење на 256 вредности за вашите карактери, 428 00:26:23,290 --> 00:26:26,390 не сте навистина се планира напред, бидејќи сега немаш начин да се каже, 429 00:26:26,390 --> 00:26:29,750 "Ова не е legit карактер, ова е некоја погрешна порака." 430 00:26:29,750 --> 00:26:32,430 Значи она што во светот не е, тие ги користат следната најголема вредност, 431 00:26:32,430 --> 00:26:35,790 нешто како int, така што ќе имаат луди број на битови, 432 00:26:35,790 --> 00:26:39,610 32 за 4 милијарди можни вредности, така што можете едноставно да заврши користење, 433 00:26:39,610 --> 00:26:44,800 суштина, 257 од нив, од кои 1 има некои посебни значење како грешка. 434 00:26:44,800 --> 00:26:49,190 >> Да видиме како тоа функционира. Во согласност 246, имам овој голем додека јамка 435 00:26:49,190 --> 00:26:54,530 кој е повикувајќи fgetc ѓ значење датотека, getc, а потоа stdin. 436 00:26:54,530 --> 00:26:59,030 Излегува ова е само повеќе прецизен начин на велејќи: "чита влез од тастатура." 437 00:26:59,030 --> 00:27:02,730 Стандарден влез средства тастатура, стандарден излез значи екран, 438 00:27:02,730 --> 00:27:06,920 и стандардна грешка, што ќе видиме во pset 4, значи на екранот, 439 00:27:06,920 --> 00:27:09,670 но посебен дел на екранот, така што тоа не е измешано 440 00:27:09,670 --> 00:27:13,760 со реалните излез кој сте имале намера да печати, но повеќе за тоа во иднина. 441 00:27:13,760 --> 00:27:19,430 Значи fgetc само значи чита еден карактер од тастатура, и чувајте го каде? 442 00:27:19,430 --> 00:27:24,000 Чувајте го во C, а потоа проверете, па јас сум само користење на некои логичка сврзници тука, 443 00:27:24,000 --> 00:27:28,430 провери дека не е еднаква \ n, па така корисниците нема притиснете ентер. 444 00:27:28,430 --> 00:27:31,510 Сакаме да престанат во тој момент, на крајот од циклусот, и ние исто така сакаме да се провери 445 00:27:31,510 --> 00:27:36,170 за посебните константна, EOF, што ако знаете или се погоди - она ​​што не го штанд за? 446 00:27:36,170 --> 00:27:39,860 Крајот на датотеката. Па ова е вид на бесмислени, бидејќи ако јас сум пишување на тастатура, 447 00:27:39,860 --> 00:27:41,900 има навистина нема датотеки се вклучени во овој, 448 00:27:41,900 --> 00:27:44,330 но ова е само вид на генерички термин кој се користи да значи 449 00:27:44,330 --> 00:27:50,320 дека ништо друго не доаѓа од прстите на човечкиот. EOF. Крајот на датотеката. 450 00:27:50,320 --> 00:27:52,600 Како настрана, ако некогаш сте хит контрола г на вашата тастатура, 451 00:27:52,600 --> 00:27:54,680 не дека ќе имаат уште, вие сте хит контрола в. 452 00:27:54,680 --> 00:27:57,920 Но контрола г праќа оваа специјална постојана наречен EOF. 453 00:27:57,920 --> 00:28:03,100 >> Па сега ние само треба некои динамичен алокација на меморија. 454 00:28:03,100 --> 00:28:06,460 Значи, ако n + 1> капацитет, сега јас ќе објаснам n. 455 00:28:06,460 --> 00:28:09,380 n е само колку бајти сте моментално во тампон, 456 00:28:09,380 --> 00:28:11,970 стринг тоа дека во моментов градење од корисникот. 457 00:28:11,970 --> 00:28:16,240 Ако имате повеќе карактери во вашиот тампон отколку ти што имаш капацитет во тампон, 458 00:28:16,240 --> 00:28:20,760 интуитивно, она што треба да направите потоа е додели повеќе капацитет. 459 00:28:20,760 --> 00:28:24,490 Одам да обезмаслен преку некои од аритметички тука 460 00:28:24,490 --> 00:28:26,900 и да се фокусира само на оваа функција овде. 461 00:28:26,900 --> 00:28:29,170 Знаеш што Примерок е, или барем генерално познати. 462 00:28:29,170 --> 00:28:32,380 Земете погоди што realloc прави. [Студентски одговор, неразбирливо] 463 00:28:32,380 --> 00:28:35,690 >> Да. И тоа не е сосема додавање на меморија, тоа reallocates меморија како што следува: 464 00:28:35,690 --> 00:28:40,530 Ако има уште простор на крајот од стрингот да ви даде повеќе од таа меморија 465 00:28:40,530 --> 00:28:43,370 отколку што првично ти дава, тогаш ќе се добие дека дополнителна меморија. 466 00:28:43,370 --> 00:28:46,640 Па можете да само ставање на низи карактери да се врати назад да се врати да се врати. 467 00:28:46,640 --> 00:28:49,290 Но, ако тоа не е случај, затоа што чекаше премногу долго 468 00:28:49,290 --> 00:28:51,700 и нешто случаен доби plopped во меморијата таму, но има дополнителни 469 00:28:51,700 --> 00:28:56,480 меморија тука долу, тоа е во ред. Realloc се случува да се направи сите кревање на тешки предмети за вас, 470 00:28:56,480 --> 00:28:58,810 поместите стринг ќе ги прочитате во тоа далеку од тука, 471 00:28:58,810 --> 00:29:02,550 стави таму долу, а потоа да ви даде некои повеќе пистата во тој момент. 472 00:29:02,550 --> 00:29:05,610 Така да со еден бран на страна, дозволете ми да кажам дека она што GetString прави 473 00:29:05,610 --> 00:29:09,540 е тоа е почнуваат со мали тампон, можеби 1 еден лик, 474 00:29:09,540 --> 00:29:12,300 и ако корисникот видови во 2 карактери, GetString завршува 475 00:29:12,300 --> 00:29:15,210 повикувајќи realloc и вели, "Ooh, 1 лик не беше доволно. 476 00:29:15,210 --> 00:29:18,480 Дај ми 2 знаци. " Потоа, ако се чита преку логиката на јамка, 477 00:29:18,480 --> 00:29:21,070 тоа се случува да се каже, "Ooh, корисникот ја внеле во 3 карактери. 478 00:29:21,070 --> 00:29:25,690 Дај ми сега не 2 туку 4 карактери, тогаш ми даде 8, а потоа ми даде 16 и 32 ". 479 00:29:25,690 --> 00:29:28,180 Фактот дека јас сум удвојување на капацитетот секој пат 480 00:29:28,180 --> 00:29:30,320 значи дека тампон нема да растат бавно. 481 00:29:30,320 --> 00:29:35,870 Тоа се случува да расте супер брз, и она што може да биде предност на тоа? 482 00:29:35,870 --> 00:29:38,540 Зошто сум удвојувањето на големината на баферот, иако на корисникот 483 00:29:38,540 --> 00:29:41,450 само можеби ќе треба 1 екстра лик од тастатура? 484 00:29:41,450 --> 00:29:44,830 [Студентски одговор, неразбирливо]. >> Што е тоа? 485 00:29:44,830 --> 00:29:46,750 Точно. Вие не треба да расте толку често. 486 00:29:46,750 --> 00:29:48,870 И ова е само вид на - Ти си хеџинг вашиот облози тука. 487 00:29:48,870 --> 00:29:54,150 Идејата е во тоа што вие не сакате да се јавите realloc многу, бидејќи тоа се стреми да биде бавен. 488 00:29:54,150 --> 00:29:56,840 Секое време да побара оперативниот систем за меморија, како што наскоро ќе видиме 489 00:29:56,840 --> 00:30:00,620 во иднина проблем во собата, тоа се стреми да потрае некое време. 490 00:30:00,620 --> 00:30:04,980 Значи минимизирање дека износот на време, дури и ако си трошат малку простор, има тенденција да биде добра работа. 491 00:30:04,980 --> 00:30:07,250 >> Но, ако ги чита преку завршниот дел од GetString тука, 492 00:30:07,250 --> 00:30:10,880 и повторно, разбирање секоја линија тука не е толку важно денес. 493 00:30:10,880 --> 00:30:14,830 Но, забележуваат дека на крајот повици Примерок повторно, и распределување 494 00:30:14,830 --> 00:30:16,980 точно колку бајти како што треба за низа 495 00:30:16,980 --> 00:30:21,620 а потоа фрла со повик бесплатно, прекумерно голем тампон, 496 00:30:21,620 --> 00:30:23,510 ако навистина доби двојно премногу пати. 497 00:30:23,510 --> 00:30:25,970 На кратко, тоа е како GetString работи сето ова време. 498 00:30:25,970 --> 00:30:30,100 Сите тоа го прави се чита еден карактер во време повторно и повторно и повторно 499 00:30:30,100 --> 00:30:37,930 и секој пат кога ќе треба некои дополнителни меморија, таа прашува оперативен систем за тоа со повик realloc. 500 00:30:37,930 --> 00:30:41,660 Било какви прашања? Во ред. 501 00:30:41,660 --> 00:30:45,220 >> Напад. Сега дека ние се разбираме покажувачи, или барем 502 00:30:45,220 --> 00:30:47,560 се повеќе запознаени со покажувачи, 503 00:30:47,560 --> 00:30:50,020 ајде да се разгледа како целиот свет ќе почне да пропадне 504 00:30:50,020 --> 00:30:53,160 ако не доста брани против непријателски корисници, 505 00:30:53,160 --> 00:30:55,180 луѓе кои се обидуваат да се пробие во вашиот систем. 506 00:30:55,180 --> 00:31:00,260 Луѓе кои се обидуваат да го украдат вашиот софтвер со заобиколување некои кодот за регистрација 507 00:31:00,260 --> 00:31:02,150 кои што инаку би можеле да имаат да напишеш внатре 508 00:31:02,150 --> 00:31:04,860 Фрлите поглед на овој пример тука, што е само C код 509 00:31:04,860 --> 00:31:07,920 кој има функција главна на дното, која повикува функција foo, 510 00:31:07,920 --> 00:31:12,100 И што е тоа поминува на foo? [Студентски] Еден аргумент. 511 00:31:12,100 --> 00:31:15,660 >> Еден аргумент. Значи avg [1], што значи првиот збор на корисникот внеле 512 00:31:15,660 --> 00:31:19,150 на командната линија по a.out или што на програмата се нарекува. 513 00:31:19,150 --> 00:31:24,920 Значи foo, на врвот, се во char *, но char * е токму она што? 514 00:31:24,920 --> 00:31:28,860 Стринг. Нема ништо ново тука, и дека стрингот е произволно се нарекува бар. 515 00:31:28,860 --> 00:31:36,090 Во оваа линија тука, знак в [12], во вид на полу-технички англиски јазик, што е оваа линија правиш? 516 00:31:36,090 --> 00:31:40,640 Низа на - Карактери. Дај ми низа од 12 знаци. 517 00:31:40,640 --> 00:31:44,970 Па ние може да се нарече ова тампон. Тоа е технички нарекува в, но тампон во програмирање 518 00:31:44,970 --> 00:31:47,890 само значи еден куп на простор кој може да се стави некои работи внатре 519 00:31:47,890 --> 00:31:49,940 >> Тогаш на крај, memcpy, ние не го користат пред. 520 00:31:49,940 --> 00:31:52,380 Но, што веројатно може да се погоди она што го прави тоа. Тоа копии меморија. 521 00:31:52,380 --> 00:31:58,790 Што значи тоа? Па, тоа очигледно копии бар, нејзиниот влез, во в, 522 00:31:58,790 --> 00:32:03,420 но само до должината на бар. 523 00:32:03,420 --> 00:32:07,440 Но, има бубачка тука. 524 00:32:07,440 --> 00:32:14,500 Океј, па технички ние навистина треба да направите strlen (bar) x sizeof (знак), тоа е точно. 525 00:32:14,500 --> 00:32:17,920 Но, во најлош случај тука, да претпоставиме дека that's - така, во ред. 526 00:32:17,920 --> 00:32:23,760 Потоа, тука е 2 грешки. Значи sizeof (знак), во ред, ајде да се направи ова малку пошироко. 527 00:32:23,760 --> 00:32:28,860 Така, сега таму е уште една грешка, што е она? 528 00:32:28,860 --> 00:32:31,630 [Студентски одговор, неразбирливо] >> Проверете за што? Океј, па ние треба да се проверува 529 00:32:31,630 --> 00:32:35,010 за NULL, бидејќи лоши работи се случуваат кога покажувачот е NULL, 530 00:32:35,010 --> 00:32:38,490 Бидејќи може да заврши случува таму, а ти не секогаш треба да се оди на NULL 531 00:32:38,490 --> 00:32:40,890 од dereferencing тоа со * оператор. 532 00:32:40,890 --> 00:32:45,250 Па тоа е добро, а што друго правиме ние? Логично има пукнатина тука. 533 00:32:45,250 --> 00:32:47,650 [Студентски одговор, неразбирливо] 534 00:32:47,650 --> 00:32:51,340 >> Значи провери дали argc ≥ 2? 535 00:32:51,340 --> 00:32:54,130 Океј, па има 3 грешки во оваа програма тука. 536 00:32:54,130 --> 00:33:00,080 Ние не сме проверка ако корисникот навистина внесе во нешто во avg [1], добро. 537 00:33:00,080 --> 00:33:02,240 Значи она што е трета грешка? Да? 538 00:33:02,240 --> 00:33:04,420 [Студентски одговор, неразбирливо] >> Добро. 539 00:33:04,420 --> 00:33:09,590 Значи ние проверуваат едно сценарио. Ние имплицитно проверени не копија повеќе меморија 540 00:33:09,590 --> 00:33:12,800 отколку што би ги надминуваат должина од бар. 541 00:33:12,800 --> 00:33:15,720 Значи, ако стрингот на корисникот внесе во е 10 карактери, 542 00:33:15,720 --> 00:33:18,260 ова е велејќи: "Само копирајте 10 карактери." 543 00:33:18,260 --> 00:33:21,140 И тоа е во ред, но што ако корисникот ја внеле во еден збор во конзолата 544 00:33:21,140 --> 00:33:29,360 како 20 карактери збор, тоа е, велејќи копија 20 ликови од бар во што? 545 00:33:29,360 --> 00:33:32,840 в, инаку позната како нашите тампон, што значи дека само напишав податоци 546 00:33:32,840 --> 00:33:35,950 до 8 бајт локации кои не поседувате, 547 00:33:35,950 --> 00:33:38,320 и не ги поседувате во смисла дека никогаш не сте ги распределени. 548 00:33:38,320 --> 00:33:41,190 Значи тоа е она што е општо познато како на buffer overflow напад, 549 00:33:41,190 --> 00:33:46,650 или тампон превишаването напад, а тоа е нападот во смисла дека ако корисникот 550 00:33:46,650 --> 00:33:50,650 или програма која е повикувајќи вашата функција е тоа злобно, 551 00:33:50,650 --> 00:33:53,780 она што всушност се случува понатаму може да биде многу лошо. 552 00:33:53,780 --> 00:33:55,690 >> Ајде да ги разгледаме во оваа слика овде. 553 00:33:55,690 --> 00:33:59,070 Оваа слика претставува вашиот магацинот на меморија. 554 00:33:59,070 --> 00:34:01,050 И се потсетиме дека секој пат кога ќе се јавите на функција, 555 00:34:01,050 --> 00:34:04,520 ќе добиете оваа мала рамка на магацинот, а потоа уште еден, а потоа уште еден, а потоа друг. 556 00:34:04,520 --> 00:34:07,250 И досега ние сме само вид на апстрахирани овие далеку како правоаголници 557 00:34:07,250 --> 00:34:09,380 или има на одборот или на екранот овде. 558 00:34:09,380 --> 00:34:12,219 Но, ако ние зумирате на еден од оние правоаголници, 559 00:34:12,219 --> 00:34:16,460 кога ќе се јавите на функција foo, излегува дека има уште на магацинот 560 00:34:16,460 --> 00:34:18,739 внатрешноста на таа рамка и дека правоаголник 561 00:34:18,739 --> 00:34:23,370 од само x и y и А и Б, како што се зборува за swap. 562 00:34:23,370 --> 00:34:25,949 Излезе дека постојат некои пониско ниво детали, 563 00:34:25,949 --> 00:34:27,780 меѓу нив вратат адреса. 564 00:34:27,780 --> 00:34:33,020 Значи испаѓа кога главната повици foo, главни треба да го извести foo 565 00:34:33,020 --> 00:34:36,760 она адреса главната е во меморијата на компјутерот. 566 00:34:36,760 --> 00:34:40,659 Затоа што во спротивно, штом foo е направено извршување, како во овој случај тука, 567 00:34:40,659 --> 00:34:43,790 Откако ќе стигнат до оваа блиску кадрава голема заграда на крајот на foo, 568 00:34:43,790 --> 00:34:48,860 како што е грижам не foo знаат каде контрола на програмата треба да се оди? 569 00:34:48,860 --> 00:34:52,460 Се испоставува дека одговорот на тоа прашање е во тоа црвено правоаголник тука. 570 00:34:52,460 --> 00:34:56,130 Ова претставува покажувач, и тоа е до компјутер за чување, привремено, 571 00:34:56,130 --> 00:35:00,250 на т.н. магацинот на адреса на главниот така што веднаш штом foo е направено извршување, 572 00:35:00,250 --> 00:35:04,110 на компјутерот знае каде и што линија во главниот да се врати. 573 00:35:04,110 --> 00:35:06,900 Зачувани рамка покажувачот се однесува слично на ова. 574 00:35:06,900 --> 00:35:09,620 Char * бар тука претставува она? 575 00:35:09,620 --> 00:35:14,740 Па, сега овој сино сегмент тука е рамка на foo, она што е бар? 576 00:35:14,740 --> 00:35:18,300 Океј, па бар е само аргумент на функцијата foo. 577 00:35:18,300 --> 00:35:20,720 >> Па сега ние сме назад во запознаени слика. 578 00:35:20,720 --> 00:35:22,960 Има уште работи и повеќе одвлекување на вниманието на екранот 579 00:35:22,960 --> 00:35:27,490 но ова светло сина сегмент е она што ние сме биле цртање на таблата за нешто како swap. 580 00:35:27,490 --> 00:35:31,890 Тоа е рамка за foo и единственото нешто во неа во моментов е бар, 581 00:35:31,890 --> 00:35:34,630 кој е овој параметар. 582 00:35:34,630 --> 00:35:39,840 Но, што друго треба да биде во магацинот, во согласност со овој код овде? 583 00:35:39,840 --> 00:35:44,280 Char в [12]. Така и ние треба да се види 12 квадрати на меморија, 584 00:35:44,280 --> 00:35:46,260 доделени на променлива наречена в. 585 00:35:46,260 --> 00:35:48,340 И навистина ние немаме оној на екранот. 586 00:35:48,340 --> 00:35:51,650 На самиот врв има в [0], а потоа авторот на овој дијаграм 587 00:35:51,650 --> 00:35:55,130 не се мачи цртање на сите плоштади, но таму навистина се 12 има 588 00:35:55,130 --> 00:36:00,120 бидејќи, ако се погледне во долниот десен, в [11], ако смета од 0, е 12 такви бајти. 589 00:36:00,120 --> 00:36:06,190 Но, тука е проблемот: Во која насока се в расте? 590 00:36:06,190 --> 00:36:10,390 Вид на врвот надолу, нели? Ако тоа почнува на врвот и расте до дното, 591 00:36:10,390 --> 00:36:13,480 не изгледа како ние самите остави многу пистата тука на сите. 592 00:36:13,480 --> 00:36:15,320 Ние сме вид на се насликани во еден агол, 593 00:36:15,320 --> 00:36:20,210 и дека в [11] е право против бар, кој е во право против магацинот рамка покажувач, 594 00:36:20,210 --> 00:36:23,800 кој е во право против враќањето адреса; нема повеќе простор. 595 00:36:23,800 --> 00:36:26,100 Значи она што е импликација, а потоа, ако зафркнам, 596 00:36:26,100 --> 00:36:30,460 и ќе се обидат читање 20 бајти во 12-бајт тампон? 597 00:36:30,460 --> 00:36:33,460 Каде се оние 8 дополнителни бајти ќе одат? 598 00:36:33,460 --> 00:36:36,370 Внатре пак речиси сè друго, од кои некои се супер важно. 599 00:36:36,370 --> 00:36:40,480 И најважно, потенцијално, е црвено поле таму, враќање адреса. 600 00:36:40,480 --> 00:36:44,720 Бидејќи претпоставувам дека сте или случајно или adversarially 601 00:36:44,720 --> 00:36:48,040 пребришете овие 4 бајти, што покажувачот адреса, 602 00:36:48,040 --> 00:36:53,190 не само со ѓубре, но со голем број што се случува да претставуваат вистинската адреса во меморијата? 603 00:36:53,190 --> 00:36:55,930 Што е implicaiton, логично? 604 00:36:55,930 --> 00:36:59,080 [Студентски одговори, неразбирливо] >> Токму така. Кога foo враќа 605 00:36:59,080 --> 00:37:03,560 и хитови што кадрава голема заграда, програмата ќе продолжи да не се врати во главната, 606 00:37:03,560 --> 00:37:08,320 тоа се случува да се врати на она што адресата е дека црвено поле. 607 00:37:08,320 --> 00:37:11,560 >> Сега, во случај на заобиколување софтвер регистрација, 608 00:37:11,560 --> 00:37:14,400 она што е адресата и тоа е се врати се во функција 609 00:37:14,400 --> 00:37:18,820 кои нормално добива распишани откако сте платени за софтвер и внесуваат вашата регистрација код? 610 00:37:18,820 --> 00:37:23,160 Можете да ги сортирате на трик на компјутерот во нема тука, но наместо тоа, ќе се тука. 611 00:37:23,160 --> 00:37:27,950 Или, ако сте навистина паметна, противник всушност може да напишете на тастатурата, 612 00:37:27,950 --> 00:37:32,500 на пример, не е вистинскиот збор, а не 20 карактери, но претпоставувам тој или таа 613 00:37:32,500 --> 00:37:36,200 видови во некои знаци кои претставуваат код? 614 00:37:36,200 --> 00:37:38,860 И тоа нема да биде C код, тоа се случува да бидат ликови 615 00:37:38,860 --> 00:37:42,920 кои претставуваат бинарни машина кодови, 0 и 1 е. 616 00:37:42,920 --> 00:37:46,740 Но, претпоставувам дека си паметен доволно за да го направи тоа, некако ставете во GetString брза 617 00:37:46,740 --> 00:37:49,460 нешто што е суштина Составувач код, 618 00:37:49,460 --> 00:37:56,900 и последната 4 бајти запише дека враќањето адреса, и она адреса е дека влезот направам? 619 00:37:56,900 --> 00:38:01,860 Тоа продавници во црвено правоаголник адресата на првиот бајт од тампон. 620 00:38:01,860 --> 00:38:04,270 Значи мора да биде навистина паметна, и ова е многу обиди и грешки 621 00:38:04,270 --> 00:38:08,500 за лоши луѓе таму, но ако можете да дознаам колку е голема оваа тампон е, 622 00:38:08,500 --> 00:38:12,170 така што во последните неколку бајти во влезот дека ќе им обезбеди на програмата 623 00:38:12,170 --> 00:38:15,970 се случи да биде еквивалент на адресата на почетокот на вашиот тампон, 624 00:38:15,970 --> 00:38:22,270 можете да го направите тоа. Ако кажеме, нормално, здраво, и \ 0, тоа е она што завршува во тампон. 625 00:38:22,270 --> 00:38:27,860 Но, ако ние сме повеќе умен, а ние ја пополни таа тампон со она што генерички Ќе му се јавам напад код, 626 00:38:27,860 --> 00:38:31,920 А, А, А, А: напад, напад, напад, напад, каде што ова е само нешто што прави нешто лошо. 627 00:38:31,920 --> 00:38:35,190 Па, она што се случува ако сте навистина паметна, може да го направите ова: 628 00:38:35,190 --> 00:38:41,740 Во црвената кутија тука е низа од броеви: 80, CO, 35, 08. 629 00:38:41,740 --> 00:38:44,890 Забележете дека тоа се совпаѓа со бројот што е овде горе. 630 00:38:44,890 --> 00:38:47,280 Тоа е во обратен редослед, но повеќе за тоа друг пат. 631 00:38:47,280 --> 00:38:51,430 Забележете дека ова враќање адреса е намерно изменети 632 00:38:51,430 --> 00:38:54,970 да се изедначи со адреса се тука, а не на адреса на главниот. 633 00:38:54,970 --> 00:39:00,170 Значи, ако лошо момче е супер паметни, тој или таа се случува да се вклучат во тој напад код 634 00:39:00,170 --> 00:39:02,890 нешто како, "Избриши ги сите датотеки на корисникот." 635 00:39:02,890 --> 00:39:06,320 Или "Копија на лозинки," или "Креирај корисничка сметка дека можам да се логирам во. ' 636 00:39:06,320 --> 00:39:10,130 Ништо на сите, а тоа е и опасноста и моќта на Ц 637 00:39:10,130 --> 00:39:12,900 Бидејќи имате пристап до меморијата преку совети 638 00:39:12,900 --> 00:39:15,950 и затоа може да напише нешто што сакате во меморијата на компјутерот. 639 00:39:15,950 --> 00:39:19,290 Може да се направи компјутерски направи нешто што сакате со едноставно 640 00:39:19,290 --> 00:39:22,780 откако ја скокаат околу во рамките на својата мемориски простор. 641 00:39:22,780 --> 00:39:27,230 И така, на овој ден, толку многу програми и толку многу веб-сајтови кои се компромитирани 642 00:39:27,230 --> 00:39:29,730 се сведуваат на луѓето да ги искористат предностите на ова. 643 00:39:29,730 --> 00:39:32,510 И ова може да изгледа како супер-софистицирана напад, 644 00:39:32,510 --> 00:39:34,220 но тоа не секогаш ќе започне на тој начин. 645 00:39:34,220 --> 00:39:36,770 >> Реалноста е дека она што лоши луѓе обично ќе направите, е, 646 00:39:36,770 --> 00:39:41,470 дали тоа е програмата на командната линија или програма GUI или веб-сајт, 647 00:39:41,470 --> 00:39:43,290 е ли само ја стартувате обезбедување глупости. 648 00:39:43,290 --> 00:39:46,940 Можете да напишете во еден навистина голем збор во полето за пребарување и притиснете ентер, 649 00:39:46,940 --> 00:39:49,030 и ќе чекате да се види дали на веб-сајтот се урна. 650 00:39:49,030 --> 00:39:53,270 Или ќе чекате да се види дали на програмата манифестира некои порака за грешка. 651 00:39:53,270 --> 00:39:55,480 Бидејќи ако имаат среќа, како негативец, 652 00:39:55,480 --> 00:39:59,610 и ви обезбеди некои луди влез што се урна на програмата, 653 00:39:59,610 --> 00:40:02,280 тоа значи дека на програмерот не се антиципираат вашите лошо однесување 654 00:40:02,280 --> 00:40:05,420 што значи дека може да веројатно, со доволно напор, 655 00:40:05,420 --> 00:40:09,870 доволно обиди и грешки, да дознаам како да се отпочне попрецизно напад. 656 00:40:09,870 --> 00:40:15,900 Така што голем дел од безбедноста не е само избегнување на овие напади целосно, но откривање на нив 657 00:40:15,900 --> 00:40:20,250 а всушност во потрага на регистрите и види што луди влезови има луѓе ја внеле во вашиот вебсајт. 658 00:40:20,250 --> 00:40:26,040 Што услови за пребарување се луѓе ја внеле во вашиот веб-сајт во надеж дека ќе преплавени некои тампон? 659 00:40:26,040 --> 00:40:28,900 И, сето тоа се сведува на едноставна основите на она што е низа, 660 00:40:28,900 --> 00:40:32,510 и што значи тоа за алоцирање и употреба меморија? 661 00:40:32,510 --> 00:40:34,920 И во врска со тоа, исто така, е ова. 662 00:40:34,920 --> 00:40:37,520 >> Па да се загледувам во внатрешноста на хард дискот уште еднаш. 663 00:40:37,520 --> 00:40:40,190 Така да се потсетиме од една недела или две пред тоа кога ќе повлечете датотеки 664 00:40:40,190 --> 00:40:45,470 до ѓубрето или корпата за ѓубре, што се случува? 665 00:40:45,470 --> 00:40:47,850 [Студентски] Ништо. >> Да, апсолутно ништо. Конечно, ако се намалат 666 00:40:47,850 --> 00:40:51,370 простор на дискот, Windows или Mac OS ќе започне бришење на датотеки за вас. 667 00:40:51,370 --> 00:40:53,670 Но, ако повлечете нешто таму, тогаш тоа не е воопшто безбедно. 668 00:40:53,670 --> 00:40:56,550 Сите ваши roomate, пријател или член од семејството треба да направите е да кликнете двапати, и Voila. 669 00:40:56,550 --> 00:40:59,720 Има сите површни датотеки кои сте се обиделе да ги избришете. 670 00:40:59,720 --> 00:41:02,840 Па повеќето од нас барем знам дека треба да се десен клик или контрола клик 671 00:41:02,840 --> 00:41:05,320 и празни ѓубрето, или нешто слично. 672 00:41:05,320 --> 00:41:07,900 Но, дури и тогаш, тоа сосема не го направите трик. 673 00:41:07,900 --> 00:41:11,340 Затоа што она што се случува кога имате фајл на вашиот хард диск 674 00:41:11,340 --> 00:41:14,590 кој претставува некои Word документ или некои JPEG? 675 00:41:14,590 --> 00:41:18,820 И ова претставува вашиот хард диск, и да речеме оваа треска тука претставува таа датотека, 676 00:41:18,820 --> 00:41:21,640 и тоа е составен од целиот куп на 0 и 1 е. 677 00:41:21,640 --> 00:41:25,470 Што се случува кога не сте само повлечете таа датотека на trashcan или ѓубрето, 678 00:41:25,470 --> 00:41:30,390 но, исто така, го испразните? 679 00:41:30,390 --> 00:41:32,820 Вид на ништо. Тоа не е апсолутно ништо сега. 680 00:41:32,820 --> 00:41:37,630 Сега тоа е само ништо, бидејќи малку нешто се случува во форма на оваа табела. 681 00:41:37,630 --> 00:41:41,170 Значи има некој вид на база на податоци или маса во внатрешноста на меморија на компјутерот 682 00:41:41,170 --> 00:41:44,470 што во суштина има 1 колона за датотеки имиња, 683 00:41:44,470 --> 00:41:50,550 и 1 колона за локација датотека, каде што ова може да биде локација 123, само случаен број. 684 00:41:50,550 --> 00:41:58,270 Значи, ние би можеле да имаат нешто како x.jpg и локација 123. 685 00:41:58,270 --> 00:42:02,870 И што се случува потоа, кога ќе го испразните ѓубрето? 686 00:42:02,870 --> 00:42:06,720 Што оди далеку. Но, она што не оди далеку е 0 и 1 е. 687 00:42:06,720 --> 00:42:09,690 >> Значи она што е, тогаш, врската со pset 4? 688 00:42:09,690 --> 00:42:13,460 Па, со pset 4, само затоа што ние сме случајно избришани 689 00:42:13,460 --> 00:42:15,890 на Compact Flash картичка, која имаше сите овие фотографии, 690 00:42:15,890 --> 00:42:18,710 или само затоа што од лоша среќа стана оштетени, 691 00:42:18,710 --> 00:42:21,170 не значи дека 0 и 1 не се сè уште таму. 692 00:42:21,170 --> 00:42:23,920 Можеби неколку од нив се изгубени затоа што нешто доби оштетени 693 00:42:23,920 --> 00:42:26,530 во смисла дека некои 0 стана 1 и 1 стана 0 е. 694 00:42:26,530 --> 00:42:30,460 Лоши работи може да се случи поради кабриолет софтвер или неисправни хардвер. 695 00:42:30,460 --> 00:42:33,510 Но, многу од оние битови, можеби дури и 100% од нив се уште се таму, 696 00:42:33,510 --> 00:42:38,330 тоа е само дека компјутерот или камерата не знае каде JPEG 1 почна 697 00:42:38,330 --> 00:42:41,660 и каде JPEG 2 отворени, но ако, програмер, 698 00:42:41,660 --> 00:42:45,800 Знаеш, со малку такт, каде што оние JPEG слики, или она што тие изгледаат, 699 00:42:45,800 --> 00:42:49,570 може да се анализира 0 и 1, и велат, "Ooh. JPEG. Ooh, JPEG ". 700 00:42:49,570 --> 00:42:52,830 Можете да напишете програма со суштина само за или додека јамка 701 00:42:52,830 --> 00:42:56,100 која го обновува секој еден од овие датотеки. 702 00:42:56,100 --> 00:42:59,360 Така лекција тогаш, е да се започне "безбедно" бришење на вашите датотеки 703 00:42:59,360 --> 00:43:01,720 ако сакате да се избегне ова заедно. Да? 704 00:43:01,720 --> 00:43:06,940 [Студентски збор, неразбирливо] 705 00:43:06,940 --> 00:43:11,150 >> Имаат повеќе меморија отколку што направи пред - 706 00:43:11,150 --> 00:43:14,790 Ох! Добро прашање. Па зошто, тогаш, по празнење на ѓубрето, 707 00:43:14,790 --> 00:43:18,300 Дали вашиот компјутер да ви кажам дека имате повеќе слободен простор отколку што беше пред тоа? 708 00:43:18,300 --> 00:43:22,450 Во мало, затоа што тоа е лажење. Повеќе технички, имате повеќе простор. 709 00:43:22,450 --> 00:43:26,720 Бидејќи сега вие рековте, може да се стави други нешта каде таа датотека некогаш беше, 710 00:43:26,720 --> 00:43:28,930 но тоа не значи дека битови се оди, 711 00:43:28,930 --> 00:43:33,070 и тоа не значи дека на битови се промени сето 0, на пример, за ваша заштита. 712 00:43:33,070 --> 00:43:37,520 Спротивно на тоа, ако "безбедно" избрише датотеки, или физички уништи уред, 713 00:43:37,520 --> 00:43:40,810 дека навистина е единствениот начин, понекогаш, околу тоа. 714 00:43:40,810 --> 00:43:45,300 Па зошто да не се остави на тој полу-страшно белешка, и ние ќе се видиме в понеделник. 715 00:43:45,300 --> 00:43:52,810 CS50.TV