[Powered by Google Translate] [Недела 5]
[Дејвид Џ Malan - Универзитетот Харвард]
[Ова е CS50. - CS50.TV]
>> Ова е CS50, Недела 5.
Денес и оваа недела, ќе се воведат малку во светот на криминолошки науки
во контекст на проблемот Намести 4.
Денес ќе биде скратен предавање бидејќи има посебен настан овде потоа.
Па ние ќе се погледнеме и душманке и учениците и родителите, така и денес
со некои од работите кои се на хоризонтот.
>> Меѓу нив, од понеделник, ќе имате уште неколку соученици.
edx, Харвард и нови МИТ онлајн иницијатива за OpenCourseWare и повеќе,
е подигнувањето на кампусот на Харвард во понеделникот, што значи дојде понеделник
ќе мора, како на последно брои, 86.000 дополнителни соученици
кои ќе бидат следниве заедно со предавања CS50 и делови
и walkthroughs и проблемот комплети.
И како дел од ова, ќе станат членки на инаугуративната класа на CS50 и сега CS50x.
Како дел од овој сега, свесни дека ќе има некои квит, како и.
Да се ​​подготвени за тоа, за голем број на студенти,
доволно е да се каже дека иако имаме 108 TFS и CAS,
тоа не е сосема најдобар студент-наставник сооднос еднаш сме го погоди 80.000 на студентите.
Ние нема да се оценување толку многу проблем поставува рачно,
така воведе оваа недела во проблемот собата ќе биде CS50 Проверете,
која ќе биде командната линија за комунални услуги во рамките на апаратот
дека ќе добиете откако ќе го ажурирате подоцна овој викенд.
Вие ќе бидете во можност да извршите команда, check50, на свој pset,
и ќе добиете инстант фидбек за тоа дали вашата програма е точно или неточно
според различни спецификации за дизајнот што се предвидени.
Повеќе за тоа во проблемот сет спецификација.
На CS50x соученици ќе биде со користење на овој, како и.
>> Проблемот Постави 4 е за сите криминолошки науки,
и ова pset беше навистина инспириран од некои реални нешта
при што кога бев во Факултетот јас интерниран за време
со канцеларија Окружниот обвинител Middlesex Каунти проади форензичар работа
со олово форензичар иследник.
Што ова изнесуваат, како што мислам јас спомнав неколку недели минатото,
е масата државна полиција или други ќе дојдат,
тие ќе заспивам работи како хард дискови и CD-а и флопи дискови и слично,
а потоа целта на криминолошки науки канцеларија беше да се утврди
дали имало или не беше доказ на некој вид.
Ова беше специјални истраги единица, па тоа беше чиновнически криминал.
Тоа беше повеќе вознемирувачки вид на кривични дела, ништо вклучуваат некој вид на дигиталните медиуми.
Излегува дека не дека многу луѓе пишуваат е-маил велејќи: "Дали јас тоа."
Па доста често, овие форензичар пребарувања не се претвори до сите дека многу овошје,
но понекогаш луѓето ќе пишуваат такви пораки.
Па понекогаш, напорите беа наградени.
>> Но да се доведе до оваа судска pset, ќе биде воведување во pset4 малку графика.
Вие веројатно се овие работи здраво за готово - JPEG слики, GIFs, и слично - овие денови.
Но, ако навистина мислиш за тоа, слика, слично како лице на Rob,
може да се моделираат како секвенца од точките или пиксели.
Во случај на лице Роб, има сите видови на бои,
и почнавме да ја видите поединечни точки, инаку позната како пиксели,
еднаш почнавме да зумирате внатре
Но, ако ги поедностави светот малку и само велат дека ова тука е Роб во црно и бело,
да претставуваат црно и бело, ние само може да се користи бинарни.
И ако ние се случува да се користи бинарни, 1 или 0, можеме да ги изразат оваа иста слика
на насмеано лице Rob со овој модел на битови.
11000011 претставува бела, бела, црна, црна, црна, црна, бела, бела.
И така тоа не е огромен скок потоа да почнам да зборувам за шарени фотографии,
работи што ќе видите на Фејсбук или се со дигитална камера.
Но секако кога станува збор за боите, ви треба повеќе битови.
И доста честа појава во светот на фотографии е да се користи не 1-bit-на боја,
како ова сугерира, но 24-битна боја, каде што всушност милиони бои.
Така што кога ќе зумира во на око на Rob во случајот,
тоа беше било кој број на милиони различни шарени можности.
Па ние ќе се воведе ова Проблем Постави 4, како и во Walkthrough,
кој ќе биде денес во 03:30 наместо вообичаените 02:30 поради предавање во петокот тука.
Но, видеото ќе биде онлајн, како и обично утре.
>> Ние исто така ќе ве запознаам со друг формат на датотека.
Ова е намерно со цел да изгледа застрашувачки на прв,
но ова е само некоја документација за struct Ц.
Излегува дека Мајкрософт години помогна во промовирањето на овој формат
наречен bitmap формат на датотека, BMP, и тоа беше супер едноставна, шарени графички формат на датотека
која била искористена за сосема извесно време, а понекогаш уште за позадини за десктоп компјутерите.
Ако мислите назад на Windows XP и ридови и сино небо,
тоа беше обично BMP или bitmap слика.
Bitmaps се забава за нас, бидејќи тие имаат малку повеќе комплексност.
Тоа не е толку едноставно како ова решетка од 0-ти и 1S.
Наместо тоа, имаш работи како насловот на почетокот на датотека.
Значи со други зборови, во внатрешноста на. BMP датотека е целиот куп на 0-ти и 1S,
но има некои дополнителни 0-ти и 1S во таму.
И излегува дека она што веројатно зема здраво за готово со години -
формати на датотеки како. doc или. xls или. mp3,. Mp4, без оглед на формати на датотеки
дека сте запознаени со - што значи дека дури и значи да се биде формат на датотека,
бидејќи на крајот на денот сите овие датотеки ние ги користиме имаат само 0-ти и 1S.
А можеби и оние 0-ти и 1S претставуваат АБЦ преку ASCII или слично,
но на крајот на денот, тоа е сепак само 0-ти и 1S.
Значи луѓето само повремено одлучи да измисли нов формат на датотека
каде што се стандардизира какви модели на битови, всушност, ќе значи.
И во овој случај тука, на луѓе кои дизајниран bitmap формат на датотека
рече дека во првиот бајт во битмапа датотеки, како означува со офсет 0 таму,
таму ќе бидат некои cryptically име променлива наречена bfType,
кои само се залага за bitmap тип на датотека, каков вид на bitmap датотека е ова.
Можете да заклучиме можеби од вториот ред што офсет 2, бајт број 2,
има модел на 0-ти и 1S кој претставува она? Големината на нешто.
И тоа оди од таму.
Значи во Проблем Постави 4, ќе се одеше преку некои од овие работи.
Ние нема да заврши се грижат за сите нив.
Но забележите тоа ќе почне да се интересни околу бајт 54: rgbtBlue, зелена и црвена.
Ако некогаш сте слушнале акроним RGB - црвена, зелена, сина - ова е референца за таа
бидејќи излегува дека може да наслика сите бои на виножитото
со некоја комбинација од сина и црвена и зелена боја.
И всушност, родителите во собата може да се потсетиме на некои од најраните проектори.
Овие денови, само види еден светлина излегува од леќа,
но назад во текот на денот сте имале црвена леќа, сини леќи, и зелени леќа,
и заедно со цел екран и формираше шарени сликата.
И доста често, средните училишта и средните училишта ќе имаат оние леќи
некогаш толку малку askew, па сте биле вид на гледање двоен или троен слики.
Но, тоа беше идејата. Сте имале црвена и зелена и сина светлина сликарство слика.
И дека истиот принцип се користи во компјутерите.
>> Значи меѓу предизвици тогаш за вас во Проблем Постави 4 ќе бидат неколку работи.
Една од нив е да се всушност промените големината на сликата, да се земе во модел на 0-ти и 1S,
дознаам што делови од 0-ти и 1S претставуваат она што во структурата како оваа,
а потоа дознаам како да се реплицираат во пиксели - на црвена, блуз, зелена -
внатре, така што кога сликата изгледа вака на почетокот,
тоа може да изгледа вака наместо после тоа.
Меѓу другите предизвици премногу ќе биде дека ќе им бидат предадени на судските сликата
на вистински датотека од дигитален фото апарат.
И на тој апарат, еднаш многу одамна, беа еден куп фотографии.
Проблемот е што случајно избришани или имале сликата расипана некако.
Лоши работи се случуваат со дигитални камери.
И така ние брзо копирани сите на 0-ти и 1S на тој картичка за вас,
спаси сите нив во една голема датотека, а потоа ќе ги предаде на вас во Проблем Намести 4
така што можете да напишете програма во C со што да се опорави сите оние JPEG слики, идеално.
И излегува дека JPEG слики, иако тие се малку на комплексни формат на датотека -
тие се многу посложени од тоа насмеано лице тука -
излегува дека секој JPEG започнува со истите модели на 0-ти и 1S.
Значи со користење, во крајна линија, додека јамка или за телефонска линија или слично,
можете да iterate во текот на сите 0-ти и 1S во овој форензички слика,
и секој пат кога ќе видите специјална шема, која е дефинирана во проблемот сет спецификација,
може да се претпостави тука е, со многу голема веројатност, на почетокот на JPEG.
И веднаш штом ќе ги најдете на иста шема одреден број на бајти
или kilobytes или мегабајти подоцна, може да се претпостави тука е втората JPEG,
слика отидов по првиот.
Дозволете ми да престане читањето дека првиот фајл, почнете со пишување на овој нов,
и излез на вашата програма за pset4 ќе биде колку што 50 JPEG слики.
И ако тоа не е 50 JPEG слики, имате малку на јамка.
Ако имате неограничен број на JPEG слики, имаш бесконечна јамка.
Така што исто така ќе биде доста чест случај.
Значи тоа е она што е на хоризонтот.
>> Квиз 0 зад нас, свесни за мојата е-маил дека секогаш постојат луѓе кои се истовремено среќни,
вид на неутрални и тажни околу квиз 0 време.
И немојте да допрат до мене, шеф ТФ Zamyla, свој ТФ,
или еден од Кас дека знаете ако би сакале да разговараат за тоа како се одвиваа работите.
>> Така да импресионира родители тука во соба, што е CS50 библиотека?
[Смеа] Добра работа.
Што е CS50 библиотека? Да. >> [Студент] Тоа е претходна писмена сет на кодот [недоловим]
Океј, добро.
Тоа е претходна писмена сет на кодот кој ние персоналот напиша, ние обезбеди за вас,
која обезбедува некои заеднички функционалност,
работи како мене да добијат низа, се ме int - сите функции кои се наведени тука.
>> Почнувајќи од сега, ние почнуваме да навистина се овие обука тркала надвор.
Ние ќе почне да се земе низа од вас,
кој се потсетиме беше само синоним за каков тип на податоци? >> [Повеќе студенти] char *.
Char *. За родителите, кои веројатно беше [прави whooshing звук]. Тоа е добро.
Char * ние ќе почнете да гледате на екранот сè повеќе и повеќе како што ние ги отстрани низа од нашиот речник,
барем кога станува збор за навистина пишување на код.
Слично на тоа, ние ќе престане да го користи некои од овие функции колку
бидејќи нашите програми се случува да добиете повеќе софистицирани.
Наместо само пишуваат програми кои седат таму со брза трепка,
чекање за корисникот да напишеш нешто, ќе ја добиете вашата влезови од друго место.
На пример, ќе ги добиете од серија на битови на локален хард диск.
Ти наместо ќе ги добие во иднина од некоја мрежна конекција,
некои веб некаде.
>> Значи, да лупам назад овој слој за прв пат и се повлече до CS50 апарати
и оваа датотека се нарекува cs50.h, кои сте биле # вклучувајќи недели,
но ајде да всушност гледаат она што е внатре за тоа.
На врвот на датотеката во плава е само еден куп коментари:
гаранција информации и лиценцирање.
Ова е вид на заедничка парадигма во софтвер
бидејќи многу софтвер овие денови е она што се нарекува софтвер со отворен код,
што значи дека некој има напишано на кодот и го направи слободно достапни
не само да се кандидира и да се користи, но за да всушност читање и менување и да се интегрираат во својата работа.
Значи тоа е она што сте биле користење на софтвер со отворен код, иако во многу мала форма.
Ако јас дојдете минатото на коментарите, сепак, ќе почнете да видите некои повеќе познати работи.
Известување на врвот тука дека датотеката cs50.h вклучува целиот куп на насловот датотеки.
Повеќето од овие, не сме виделе порано, но едно е познато.
Која од овие сме виделе, иако кратко, досега? >> [Студент] Стандардна библиотека.
Да, стандардната библиотека. stdlib.h има Примерок.
Откако почнавме да зборуваме за динамичка меморија распределба,
која ќе се врати на следната недела, како и, почнавме вклучувајќи таа датотека.
Излегува дека bool и вистински и лажни всушност не постои во C по себе
освен ако не се вклучи оваа датотека тука.
Ние сме со недели е вклучувајќи stdbool.h
така што можете да го користите идејата за bool, точно или неточно.
Без ова, вие ќе треба да се најде на лажни и користете int
и само произволно да се претпостави дека 0 е лажна и 1 е вистина.
Ако ние движете надолу понатаму, тука е нашата дефиниција на стринг.
Излегува, како што рековме порано, дека таму каде што оваа ѕвезда е не е важно.
Можете дури и да имаат простор наоколу.
Ние овој семестар се го промовира како ова да го направи јасно
дека ѕвездата има врска со видот,
но сфати само како заеднички, ако не и малку повеќе заеднички,
е да го оставиме таму, но функционално тоа е иста работа.
Но, сега, ако читаме долу понатаму, ајде да ги разгледаме во GetInt
бидејќи ние се користи дека можеби прво, пред било што друго овој семестар.
Тука е GetInt. Тоа е она? >> [Студент] А прототип. >> Ова е само прототип.
Често, имаме стави прототипи на врвот на нашата. В датотеки,
но вие исто така може да се стави прототипови во насловот датотеки. ж датотеки, како овој овде
така што кога ќе напишам некои функции кои сакате другите луѓе да бидат во можност да ги користат,
која е токму случајот со библиотеката CS50,
вие не само спроведување на вашиот функции во нешто како cs50.c,
исто така, се стави на прототипови не на врвот на таа датотека, но на врвот на хедер датотека.
Тогаш тоа хедер датотека е она пријатели и колеги вклучуваат
со # вклучат во нивните сопствени код.
Значи сето ова време, сте биле вклучувајќи ги и сите на овие прототипови,
ефикасно на врвот на вашата датотека, но на начин на овој # include механизам,
што во суштина копии и пасти оваа датотека во вашиот сопствен.
Еве некои прилично детални документација.
Ние сме доста зема здраво за готово дека GetInt добива int,
но излегува постојат некои агол случаи.
Што се случува ако корисник видови во број кој е премногу голем, а quintillion,
дека едноставно не може да се вклопи во внатрешноста на int? Кое е очекуваното однесување?
Идеално, тоа е предвидлив.
Значи во овој случај, ако навистина го прочитате парична казна печати,
вие всушност ќе се види дека ако линијата не може да се чита, тоа се враќа INT_MAX.
Ние никогаш не сум зборуваше за ова, но врз основа на неговата капитализација, што е веројатно?
[Студент] константа. >> Тоа е постојана.
Тоа е некои посебни константа што е веројатно прогласен во еден од оние насловот датотеки
тоа е до повисоко во датотека, а INT_MAX е веројатно нешто како речиси 2 милијарди долари,
Идејата е дека бидејќи ние мораме некако да значи дека нешто не беше во ред,
ние, да, има 4 милијарди броеви на располагање: -2 милијарди до 2 милијарди долари, или дава да потрае.
Па, што е честа појава во програмирање е да украдат само еден од тие бројки,
Можеби 0, можеби 2 милијарди, можеби -2000000000,
така да поминат една од вашите можни вредности, така што ќе можат да се посветат на светот
дека ако нешто тргне наопаку, ќе се вратам оваа супер голема вредност.
Но, вие не сакате на корисникот пишување нешто криптичната како 234 ..., навистина голем број.
Можете да го генерализира, наместо како константа.
Значи, навистина, ако сте биле тоа анален изминатите неколку недели, во секое време да те повика GetInt,
треба да се проверува со ако состојбата не на корисникот тип во INT_MAX,
или, поточно, не GetInt враќање INT_MAX, затоа што ако тоа го правеше,
што всушност значи дека тие не го напишеш. Нешто не беше во ред во овој случај.
Значи тоа е она што е општо познато како стража вредност, која едноставно значи посебно.
>> Ајде сега се претвори во. В датотека.
На датотеката C постои во апаратот за некое време.
И всушност, апаратот го има пред-состави за вас во тоа нешто што се нарекува објектен код,
но тоа едноставно не е важно за вас, каде што тоа е затоа што системот знае
во овој случај каде што е: апаратот.
Ајде да дојдете долу сега да GetInt и да видиме како GetInt работи сето ова време.
Тука имаме слични коментари од порано.
Дозволете ми да зумирате на само кодот дел.
И она што го имаме за GetInt е следниот.
Таа ги зема нема влез.
Го враќа int, додека (вистинска), па ние имаме намерно бесконечна јамка,
но се претпоставува дека ќе се пробие на ова некако или да се вратат од рамките ова.
>> Ајде да видиме како тоа функционира.
Ние се чини дека да се користат GetString во оваа прва линија во внатрешноста на јамка, 166.
Ова е сега добра практика, бидејќи под какви околности GetString може да се врати
специјални клучни зборови NULL? >> [Студент] Ако нешто тргне наопаку.
Ако нешто тргне наопаку. А што би можело да тргне наопаку кога ќе се јавите нешто како GetString?
Да. >> [Студент] Примерок не успее да го даде ints.
Да. Можеби Примерок не успее.
Некаде под хауба, GetString повикува Примерок, која доделува меморија,
кој им овозможува на компјутер продавница на сите ликови
дека корисникот видови во тастатурата.
И да претпоставиме на корисникот имаше едночудо на слободното време и внесе повеќе, на пример,
од 2 милијарди карактери, повеќе ликови од компјутер дури има и RAM меморија.
GetString мора да биде во можност да значи дека до вас.
Дури и ако тоа е супер, супер е невообичаено агол случај,
има некако да биде во можност да се справи со тоа,
и така GetString, ако се вративме и да прочитате неговата документација, дали всушност се врати NULL.
Па сега ако GetString не со враќање NULL, GetInt се случува да не успее со враќање INT_MAX
само како стража. Овие се само човечките конвенции.
Единствениот начин на кој ќе го знаеме и ова е случај е со читање на документација.
>> Ајде да дојдете до каде int е всушност добиле.
Ако јас движете надолу малку понатаму, во согласност 170, имаме коментар над овие линии.
Изјавуваме во 172 е цел број, n, и знак, в, и потоа оваа нова функција,
што некои од вас имате тетеравеше низ порано, sscanf.
Ова се залага за низа Scanf.
Со други зборови, дај ми низа и јас ќе го скенира за парчиња на информации од интерес.
Што значи тоа?
Да претпоставиме дека сум тип во буквално 123 на тастатура, а потоа притиснете ентер.
Што е податоци за видот на 123 кога се вратија од GetString? >> [Студент] Стринг.
Тоа е очигледно низа, нели? Добив стринг.
Па 123 е навистина, цитат-unquote, 123 со \ 0 на крајот од неа.
Тоа не е int. Тоа не е број. Тоа изгледа како број, но тоа не е всушност.
Значи она што не GetInt треба да направите?
Тоа мора да го скенира дека низа од лево кон десно - 123 \ 0 - и некако се претворат во вистински број.
Вие би можеле да дознаам како да го направите тоа.
Ако мислите назад кон pset2, можете веројатно добија малку удобно со Цезар
или Vigenere, па можете да iterate во текот на еден стринг, можете да конвертирате карактери да ints.
Но, подлец, тоа е многу скапо на работа.
Зошто да не се јавите на функција како sscanf дека прави тоа за вас?
Значи sscanf очекува аргумент - во овој случај се нарекува линија, која е стринг.
Тогаш наведете во наводници, многу слични на printf, што очекувате да видите во овој стринг.
И ова што го кажувам овде е што очекувам да ја видите децимален број, а можеби и карактер.
И ќе видиме зошто ова е случај во само еден миг.
И излегува дека оваа нотација е сега потсетува на нешто почнавме да зборуваме за
нешто повеќе од пред една недела.
Што е & n и и в прави за нас овде? >> [Студент] Обраќање на n и адреса на в.
Да. Тоа ми даде адресата на n и адреса на в. Зошто е тоа важно?
Вие знаете дека со функции во C, секогаш може да се врати на вредност или никаква вредност на сите.
Можете да се врати int, стринг, плови, char, што, или може да се врати празнината,
но вие само може да се врати една работа максимално.
Но тука ние сакаме sscanf да ми се врати можеби еден цел број, децимален број,
а исто така знак, и јас ќе објасни зошто знак во еден момент.
Можете успешно сакате sscanf да се врати две работи, но тоа не е само можно во C.
Можете да работите околу тоа со донесување во две адреси
затоа што веднаш штом ќе предаде функцијата две адреси,
она што може таа функција се направи со нив? >> [Студент] Напиши на оние адреси.
Тоа може да напише на тие адреси.
Можете да ги користите ѕвезда операцијата и да си одат таму, на секој од тие адреси.
Тоа е еден вид на овој back-врата механизам, но многу честа појава за менување на вредностите на променливите
повеќе од само едно место - во овој случај, две.
Сега забележиш јас сум проверка за == 1, а потоа враќање n, ако тоа се случи, всушност, се оцени на true.
Значи она што се случува? Технички, сите ние навистина сакаме да се случи во GetInt е ова.
Ние сакаме да го анализирам, така да се каже, ние сакаме да го прочитате низа - цитат-unquote 123 -
и ако изгледа има голем број таму, она што ние го кажувам sscanf да направите
се стави тој број - 123 - во оваа променлива n за мене.
Па зошто тогаш не сум всушност имаат тоа како добро?
Која е улогата на sscanf велејќи дека, исто така, може да добијат карактер тука?
[Нечујни студент одговор] >> децимална точка всушност би можеле да работат.
Ајде да се одржи таа мисла за момент. Што друго?
[Студент] Тоа може да биде NULL. >> Добра мисла. Тоа може да биде нула карактер.
Тоа не е всушност во овој случај. Да. >> [Студент] ASCII.
ASCII. Или дозволете ми да се генерализира дури и подалеку.
На% c постои само за грешка проверка.
Ние не сакаме да има карактер по број,
но она што оваа ми дозволува да направите е следново.
Излегува дека sscanf, покрај складирање вредности во n и в во овој пример тука,
што исто така не е го враќа бројот на променливи го стави вредности внатре
Значи, ако само напишете во 123, а потоа само% d ќе одговара,
и само N добива чуваат со вредност како 123,
и ништо не добива стави во в.
Ц останува ѓубре вредност, така да се каже -
ѓубре, бидејќи тоа никогаш не била иницијализирана за некои вредност.
Значи во тој случај, sscanf враќа 1 затоа што населени 1 од тие совети,
во кој случај одлично, имам int па јас ослободи линија за да се ослободи меморија
дека GetString всушност распределени, а потоа ќе се вратам n,
друго, ако некогаш сте се запрашале каде што Повторете изјава доаѓа од, доаѓа од овде.
Значи, ако, пак, јас напишете 123foo - само некои случајна секвенца на текст -
sscanf се случува да се види, број, број f,
и тоа се случува да се стави на 123 во n; тоа се случува да се стави на f во в а потоа се врати 2.
Значи имаме, само со користење на основните дефиниција на однесување sscanf, еден многу едноставен начин -
добро, комплекс на прв поглед, но на крајот на денот прилично едноставен механизам -
на велејќи дека е таму int и ако е така, е дека единственото нешто што најдов?
И празни места тука е намерно.
Ако го прочитате документацијата за sscanf, тоа ви кажува дека ако вклучуваат парче на празни места
на почетокот или на крајот, sscanf исто така ќе им овозможи на корисникот, за која било причина,
да се погоди простор бар 123 и дека ќе бидат легитимни.
Вие нема да се развикам на корисникот само затоа што тие хит на просторот бар
на почетокот или на крајот, што е само малку повеќе user-friendly.
>> Било какви прашања тогаш GetInt? Да. >> [Студент] Што ако само се стави во знак?
Добро прашање.
Што ако само ја внеле во знак како f и притиснете ентер без воопшто да пишувате 123?
Што мислите однесувањето на оваа линија код, тогаш ќе биде?
[Нечујни студент одговор]
Да, така sscanf може да ги покрие дека премногу, бидејќи во тој случај, тоа не се случува да се пополни n или в.
Тоа се случува да наместо врати 0, во кој случај јас сум исто така, фаќање на тоа сценарио
бидејќи очекуваната вредност што сакам е 1.
Јас само сакам една и само една работа да бидат пополнети. Добро прашање.
>> Другите? Во ред.
>> Да не одиме низ сите функции во тука,
но оној кој се чини дека можеби на останатите интерес е GetString
бидејќи излегува дека GetFloat, GetInt, GetDouble, GetLongLong
сите залог многу на нивната функционалност да GetString.
Па ајде да ги разгледаме во тоа како тој се спроведува тука.
Оваа една изгледа малку комплексна, но тоа го користи истиот основи
што почнавме да зборуваме за минатата недела.
Во GetString, кој се нема аргумент како на празнина се тука
и враќа стринг, јас очигледно сум прогласување на низа наречен тампон.
Јас навистина не знам што се случува да се користи за уште, но ќе видиме.
Тоа изгледа како капацитет е стандардно 0.
Не се сосема сигурни кога тоа се случува, не се сигурни што n се случува да се користи за уште,
но сега тоа е добивање малку повеќе интересно.
Во согласност 243, ние прогласи int, в.
Ова е вид на глупави детали.
А знак е 8 бита и 8 битови може да се сместат колку различни вредности? >> [Студент] 256. >> 256.
Проблемот е ако сакате да имате 256 различни ASCII карактери, кои постојат
ако мислите назад - и ова не е нешто да се запаметат.
Но, ако се сетам на толку голема ASCII табелата имавме недели,
имало во тој случај 128 или 256 ASCII карактери.
Ние се користат сите модели на 0-ти и 1S нагоре.
Тоа е проблем ако сакате да бидете во можност да детектира грешка
затоа што ако веќе сте користење на 256 вредности за вашите карактери,
не сте навистина се планира напред, бидејќи сега немаш начин да се каже,
ова не е legit карактер, ова е некои погрешни порака.
Значи она што на светот не е дека тие се користи следната најголема вредност, нешто како int,
така што ќе имаат луда број на битови, 32, на 4 милијарди можни вредности
така што можете едноставно да заврши со користење суштина 257 од нив,
Од кои 1 има некои посебни значење како грешка.
>> Да видиме како тоа функционира.
Во согласност 246, имам овој голем додека јамка која се повикува fgetc,
ѓ значење датотека, па getc, а потоа stdin.
Излегува ова е само повеќе прецизен начин на велејќи прочитате влез од тастатура.
Стандарден влез средства тастатура, стандарден излез значи екран,
и стандардна грешка, што ќе видиме во pset4, значи на екранот
но посебен дел на екранот, така што тоа не е измешано со вистински излез
што сте имале намера да печати. Но повеќе за тоа во иднина.
Значи fgetc само значи чита еден карактер од тастатура и складирање каде?
Чувајте го во в.
И потоа проверете - па јас сум само користење на некои Булова сврзници тука -
проверете дали тоа не еднакви - \ n, така што корисникот има хит Enter, ние сакаме да се запре во тој момент,
до крајот на циклусот - и ние исто така сакаме да се провери за специјални постојана EOF,
што ако знаете или се погоди, она што не го штанд за? >> [Студент] Крајот на датотека. >> Крајот на датотеката.
Ова е вид на бесмислени, бидејќи ако јас сум пишување на тастатура,
има навистина нема датотеки се вклучени во овој,
но ова е само вид на генерички термин кој се користи да значи
дека ништо друго не доаѓа од прстите на човечкиот.
EOF - крај на датотеката.
Како настрана, ако некогаш сте хит контрола D во вашата тастатура, а не дека ќе имаат уште -
Вие сте хит контрола C - Контрола D праќа оваа специјална постојана наречен EOF.
Па сега ние само треба некои динамичен алокација на меморија.
>> Значи, ако (n + 1> капацитет). Сега ќе објаснам n.
N е само колку бајти сте моментално во тампон,
стринг тоа дека во моментов градење од корисникот.
Ако имате повеќе карактери во вашиот тампон отколку ти што имаш капацитет во тампон,
интуитивно она што ние треба да направите потоа е додели повеќе капацитет.
Па ќе одам да обезмаслен преку некои од аритметички тука и се фокусира само на оваа функција овде.
Знаеш што Примерок е или се барем генерално познати.
Земете погоди што realloc прави. >> [Студент] Додава меморија.
Тоа не е сосема додавање на меморија. Тоа reallocates меморија како што следува.
Ако има уште простор на крајот од стрингот да ви даде повеќе од таа меморија
отколку што првично ти дава, тогаш ќе се добие дека дополнителна меморија.
Значи вие само може да ги стави ликовите на јажето да се врати назад да се врати да се врати.
Но, ако тоа не е случај затоа што чекаше премногу долго
и нешто случаен доби plopped во меморијата постојат
но има дополнителна меморија тука долу, тоа е во ред.
Realloc се случува да се направи сите кревање на тешки предмети за вас,
поместите стринг ќе ги прочитате во тоа далеку од тука, си го стави таму долу,
а потоа да ви даде некои повеќе пистата во тој момент.
>> Така да со еден бран на страна, дозволете ми да кажам дека она што GetString прави
е тоа е почнуваат со мали тампон, можеби еден единствен карактер,
и ако корисникот видови во два лика, GetString завршува повикувајќи realloc и вели
еден лик не беше доволно, ми даде два лика.
Потоа, ако се чита преку логиката на јамка, тоа се случува да се каже
корисникот внесе во 3 карактери; дај ми сега не 2 туку 4 карактери,
тогаш ми даде 8, а потоа ми даде 16 и 32.
Фактот дека јас сум удвојување на капацитетот секој пат
значи дека тампон нема да растат бавно, тоа се случува да расте супер брз.
И она што може да биде предност на тоа?
Зошто сум удвојувањето на големината на баферот
иако на корисникот само требаат еден дополнителен лик од тастатура?
[Нечујни студент одговор] >> Што е тоа? >> [Студент] Вие не мора да расте толку често.
Точно. Вие не треба да расте толку често.
И ова е само вид на сте хеџинг вашиот облози тука,
Идејата е дека не сакате да го повикате realloc многу, бидејќи тоа се стреми да биде бавен.
Секое време да побара оперативниот систем за меморија,
како што наскоро ќе видиме во иднина проблем во собата, тоа се стреми да потрае некое време.
Значи минимизирање дека износот на време, дури и ако си трошат малку простор,
има тенденција да биде добра работа.
>> Но, ако ги чита преку завршниот дел од GetString тука -
и повторно разбирањето секоја линија тука не е толку важно денес -
забележите дека на крајот повици Примерок повторно
и доделува точно колку бајти како што треба за низа
а потоа фрла со повик бесплатно претерано големи тампон
ако навистина доби двојно премногу пати.
Значи во кратки, тоа е како GetString работи сето ова време.
Сите тоа не се чита еден карактер во време повторно и повторно и повторно,
и секој пат кога ќе треба некои дополнителни меморија, таа прашува оперативен систем за неа
со повикување realloc.
>> Било какви прашања? Во ред.
>> Напад.
Сега дека ние се разбираме совети или барем се повеќе запознаени со покажувачи,
ајде да се разгледа како целиот свет ќе почне да пропадне
ако не доста брани против непријателски корисници,
луѓе кои се обидуваат да се пробие во вашиот систем,
луѓе кои се обидуваат да го украдат вашиот софтвер со заобиколување некои кодот за регистрација
кои што инаку би можеле да имаат да напишеш внатре
>> Фрлите поглед на овој пример тука, што е само C код кој има функција главна на дното
кој повикува функција foo. И што е тоа поминува на foo?
[Студент] Еден аргумент. >> [Malan] Еден аргумент.
Значи avg [1], што значи дека првиот збор што корисникот ја внеле во командната линија
по a.out или што на програмата се нарекува.
Значи foo на врвот зема во знак *. Но, char * е токму она што? >> [Студент] стринг.
[Malan] А стринг, па нема ништо ново тука.
Стрингот е произволно се нарекува бар.
Во оваа линија тука, знак в [12], во вид на полу-технички англиски јазик, што е оваа линија правиш?
[Студент] Низа на - >> низа на? >> [Студент] Ликови. >> Карактери.
Дај ми низа од 12 знаци. Па ние може да се нарече ова тампон.
Тоа е технички нарекува в, но тампон во програмирање само значи еден куп на просторот
што може да се стави некои работи внатре
Тогаш на крај, memcpy не сум користел пред, но веројатно може да се погоди она што го прави тоа.
Тоа копии меморија. Што значи тоа?
Тоа очигледно копии бар, нејзиниот влез, во в но само до должината на бар.
Но, има бубачка тука. >> [Студент] Вие треба sizeof карактер. >> Океј.
Технички, ние навистина треба да направите strlen (bar) * sizeof (знак)). Тоа е точно.
Но, во најлош случај тука, да претпоставиме дека that's -
Во ред. Потоа, тука е две грешки.
Значи sizeof (знак));
Да се ​​направи ова малку пошироко.
Така, сега таму е уште една грешка, што е она? >> [Нечујни студент одговор]
Проверете за што? >> [Студент] Провери за NULL.
Ние обично треба да се проверува за NULL, бидејќи лоши работи се случуваат
кога покажувачот е NULL, бидејќи може да заврши случува таму,
и не секогаш треба да се оди на NULL со dereferencing со ѕвездата оператор.
Па тоа е добро. И што друго правиме ние? Логично, има недостаток тука.
[Студент] Проверете дали argc е> = до 2.
Па проверете дали argc е> = 2. Океј, па има три грешки во оваа програма тука.
Ние сме сега проверка ако корисникот навистина внесе во нешто во avg [1]. Добро.
Значи она што е трета грешка? Да. >> [Студент] C не може да биде доволно голем.
Добро. Се пријавивме едно сценарио.
Ние имплицитно проверени не копија повеќе меморија отколку што би ги надминуваат должина од бар.
Значи, ако стрингот на корисникот внесе во е 10 карактери,
ова е велејќи дека само копија 10 карактери. И тоа е во ред.
Но, што ако корисникот ја внеле во еден збор во конзолата како 20-карактер збор?
Ова е велејќи копија 20 ликови од бар во што?
Ц, инаку позната како нашите тампон, што значи дека само напишав податоци
до 8 бајт локации кои не поседувате,
и не ги поседувате во смисла дека никогаш не сте ги распределени.
Значи тоа е она што е општо познато како на buffer overflow напад или тампон превишаването напад.
И тоа е напад во смисла дека ако корисникот или програма која е повикувајќи вашата функција
е тоа злобно, она што всушност се случува следно всушност може да биде многу лошо.
>> Па ајде да ги разгледаме во оваа слика овде.
Оваа слика претставува вашиот магацинот на меморија.
Потсетиме дека секој пат кога ќе се јавите на функција ќе добиете оваа мала рамка на магацинот
а потоа друг, а потоа уште и уште.
И досега, ние сме само вид на апстрахирани овие како правоаголници
или на табла или на екранот овде.
Но, ако ние зумирате на еден од оние правоаголници, кога ќе се јавите на функција foo,
излегува дека има уште на магацинот во внатрешноста на таа рамка во која правоаголник
од само x и y и А и Б, како што се зборува за swap.
Излезе дека има некои пониско ниво детали, меѓу нив и повратна адреса.
Значи испаѓа кога главната повици foo, главни треба да го извести foo
она адреса главната е во меморијата на компјутерот
затоа што во спротивно, штом foo е направено извршување, како во овој случај тука,
штом ќе се постигне овој затворени кадрава голема заграда на крајот на foo,
како што е грижам не foo знаат каде контрола на програмата треба да се оди?
Се испоставува дека одговорот на тоа прашање е во овој црвено правоаголник тука.
Ова претставува покажувач, и тоа е до компјутер за чување на привремено
на т.н. магацинот на адреса на главниот така што веднаш штом foo е направено извршување,
на компјутерот знае каде и што линија во главниот да се врати.
Зачувани Рамка покажувачот се однесува слично на ова.
Char * бар тука претставува она?
Сега ова сино сегмент тука е рамка на foo. Што е бар?
Бар е само аргумент на функцијата foo.
Па сега ние сме назад во вид на познатите сликата.
Има уште работи и повеќе одвлекување на вниманието на екранот,
но ова светло сина сегмент само е она што ние сме биле цртање на таблата
за нешто како swap. Тоа е рамка за foo.
И единственото нешто во неа во моментов е бар, кој е овој параметар.
Но, што друго треба да биде во магацинот во согласност со овој код овде?
[Студент] знак в [12]. >> [Malan] знак в [12].
Ние, исто така треба да се види 12 квадрати на меморија доделени на променлива наречена в,
и навистина ние немаме оној на екранот.
На самиот врв има в [0], а потоа авторот на овој дијаграм
не се мачи цртање на сите плоштади, но таму навистина се 12 има
бидејќи, ако се погледне во долниот десен, в [11] ако смета од 0 е 12-ти, како бајт.
Но, тука е проблемот.
Во која насока се в расте?
Вид на врвот надолу ако тоа почнува на врвот и расте до дното.
Тоа не изгледа како ние самите остави многу пистата тука на сите.
Ние сме вид на се насликани во еден агол,
и дека в [11] е право против бар, кој е во право против Зачувани Рамка покажувач,
кој е во право против повратна адреса. Нема повеќе простор.
Значи она што е импликација потоа ако зафркнам
и ќе се обидат читање 20 бајти во 12-бајт тампон?
Каде се оние 8 дополнителни бајти ќе одат? >> [Студент] Внатре -
Внатре пак речиси сè друго, од кои некои се супер важно.
И најважно, потенцијално, е црвено поле таму, повратна адреса,
бидејќи претпоставувам дека можете или случајно или adversarially запише овие 4 бајти,
дека покажувачот адреса, а не само со ѓубре, но со голем број
што се случува да претставува вистинската адреса во меморијата.
Што е импликација, логично? >> [Студент] Функција се случува да се врати во некое друго место.
Точно.
Кога foo враќа и хитови што кадрава голема заграда, програмата ќе продолжи
не да се врати во главната, тоа нема да се врати на она што адресата е дека црвено поле.
>> Во случај на заобиколување софтвер регистрација,
што ако адресата тоа е се врати е функција која обично добива се нарекува
откако сте платени за софтвер и внесуваат вашата регистрација код?
Можете да ги сортирате на трик на компјутерот во нема тука, но наместо тоа се случува тука.
Или ако сте навистина паметна, противник всушност може да напишете на тастатурата, на пример,
не е вистинскиот збор, а не 20 карактери, но претпоставувам тој или таа всушност видови во
некои знаци кои претставуваат код.
И тоа нема да биде C код, тоа е всушност ќе биде карактери
кои претставуваат бинарни машина код, 0-ти и 1S.
Но, претпоставувам дека си паметен доволно за да го направи тоа,
некако да ставете во GetString прашува нешто што е суштина Составувач код,
и последната 4 бајти запише дека враќањето адреса.
И она адреса е дека влезот направам?
Тоа всушност продавници во овој црвени правоаголник на адресата на првиот бајт од тампон.
Значи мора да биде навистина паметна, и ова е многу обиди и грешки за лоши луѓе таму,
но ако можете да дознаам колку е голема оваа тампон е
така што во последните неколку бајти во влезот ви обезбеди на програмата
се случи да биде еквивалент на адресата на почетокот на вашиот тампон, можете да го направите тоа.
Ако речеме нормално здраво и \ 0, тоа е она што завршува во тампон.
Но, ако ние сме повеќе умен и ние ја пополни таа тампон со она што генерички Ќе му се јавам напад код -
ААА, напад, напад, напад - кога тоа е само нешто што прави нешто лошо,
она што се случува ако сте навистина паметна, може да го направите тоа.
Во црвената кутија тука е низа од броеви - 80, C0, 35, 08.
Забележете дека тоа се совпаѓа со бројот што е овде горе.
Тоа е во обратен редослед, но повеќе за тоа друг пат.
Забележете дека ова враќање адреса е намерно изменети
да се изедначи со адреса се тука, а не на адреса на главниот.
Значи, ако лошо момче е супер паметни, тој или таа се случува да се вклучат во тој напад код
нешто како избришете сите датотеки на корисникот или копија на лозинки
или создадете корисничка сметка дека Јас тогаш може да се логирате на - ништо на сите.
>> И ова е и опасноста и моќта на Ц
Бидејќи имате пристап до меморијата преку совети
и затоа може да напише нешто што сакате во меморијата на компјутерот,
може да се направи компјутерски направи нешто што сакате
едноставно со тоа што го скокаат наоколу во рамките на својата мемориски простор.
И така до ден денес толку многу програми и толку многу веб-сајтови кои се компромитирани
се сведуваат на луѓето да ги искористат предностите на ова.
И ова може да изгледа како супер софистицирани напад, но тоа не секогаш ќе започне на тој начин.
Реалноста е дека она што лоши луѓе обично ќе направите, е,
дали тоа е програмата на командната линија или програма GUI или веб-сајт,
ли само ја стартувате обезбедување глупости.
Можете да напишете во еден навистина голем збор во полето за пребарување и притиснете Enter,
и ќе чекате да се види дали на веб-сајтот се урна
или ќе чекате да се види дали на програмата манифестира некои порака за грешка
бидејќи ако имаат среќа како лош човек и ви обезбеди некои луди влез
којшто ја дроби програма, тоа значи дека на програмерот не се антиципираат вашите лошо однесување,
што значи дека може да веројатно со доволно напор, доволно обиди и грешки,
дознаам како да се отпочне попрецизно напад.
Така што голем дел од безбедноста не е само избегнување на овие напади заедно
но откривање на нив, а всушност гледа во историјата
и види што луди влезови има луѓе внеле во вашиот сајт,
она што за пребарување се луѓе ја внеле во вашиот вебсајт
во надеж дека ќе преплавени некои тампон.
И, сето тоа се сведува на едноставна основите на она што е низа
и што значи тоа за алоцирање и употреба меморија.
>> Поврзани со тоа, тогаш премногу е ова.
Ајде само се загледувам во внатрешноста на хард дискот уште еднаш.
Се сеќавате од една недела или две пред тоа кога ќе повлечете датотеки на вашиот ѓубрето или корпата за ѓубре,
што се случува? >> [Студент] Ништо. >> Апсолутно ништо, нели?
Конечно, ако се намалат на простор на дискот,
Windows или Mac OS ќе започне бришење на датотеки за вас.
Но, ако повлечете нешто таму, тоа не е воопшто безбедно.
Сите вашиот цимер или пријател или член од семејството треба да направите е да кликнете двапати и Voila,
има сите површни датотеки кои сте се обиделе да ги избришете.
Повеќето од нас барем знам дека треба да се десен клик или контрола клик
и празни ѓубрето или нешто слично.
Но, дури и тогаш тоа сосема не го направите трик
затоа што она што се случува кога имате фајл на вашиот хард диск
кој претставува некои Word документ или некои JPEG, и ова го претставува вашиот хард диск,
и да речеме оваа треска тука претставува таа датотека,
и тоа е составен од целиот куп на 0-ти и 1S.
Што се случува кога не сте само повлечете таа датотека во ѓубрето или да ѓубрето
но, исто така, го испразните? Вид на ништо.
Тоа не е апсолутно ништо сега.
Сега тоа е само ништо, бидејќи малку нешто се случува во форма на оваа табела.
Значи има некој вид на база на податоци или маса во внатрешноста на меморија на компјутерот
што во суштина има една колона за датотеки имиња и една колона за датотеки "локација,
каде што ова може да биде локација 123, само случаен број.
Значи, ние би можеле да имаат нешто како x.jpeg и локација 123.
Што се случува тогаш кога всушност сте го испразните ѓубрето?
Што оди далеку.
Но, она што не оди далеку е 0-ти и 1S.
>> Значи она што е тогаш врската да pset4?
Па, со pset4, само затоа што ние сме случајно избришани на Compact Flash картичка
кои ги имаше сите од овие слики или само затоа што од лоша среќа стана оштетени
не значи дека 0-ти и 1S не се сеуште таму.
Можеби неколку од нив се изгубени затоа што нешто доби оштетени
во смисла дека некои 0-ти стана 1S и 1s стана 0-ти.
Лоши работи може да се случи поради кабриолет софтвер или неисправни хардвер.
Но, многу од оние битови, можеби дури и 100% од нив, се уште е таму.
Тоа е само дека компјутерот или камерата не знае каде JPEG1 отворени
и каде JPEG2 отворени.
Но, ако, програмер, знаете со малку такт кога тие JPEG слики се
или она што тие изгледаат така што може да анализира 0-ти и 1S и велат JPEG, JPEG,
можете да напише програма со суштина само еден за или додека јамка
која го обновува секој еден од овие датотеки.
Така лекција тогаш е да се започне безбедно бришење на вашите датотеки
ако сакате да се избегне ова заедно. Да.
>> [Студент] Како се вели на вашиот компјутер
дека имате повеќе меморија отколку што беше пред тоа?
Има повеќе меморија отколку што беше порано - >> [студент] Повеќе достапната меморија.
О. Добро прашање.
Па зошто тогаш по празнење на ѓубрето не вашиот компјутер ти кажам
дека имате повеќе слободен простор отколку што беше пред тоа?
Во мало, затоа што тоа е лажење.
Повеќе технички, имате повеќе простор, бидејќи сега вие рековте
може да се стави други нешта каде таа датотека некогаш беше.
Но, тоа не значи дека битови се оди,
и тоа не значи дека на битови се промени на сите 0-ти, на пример,
за Ваша заштита.
Па од друга страна, ако безбедно избрише датотеките или физички уништи уред,
дека навистина е единствениот начин понекогаш околу тоа.
>> Па зошто да не се остави на тој полу-страшно белешка, и ние ќе се видиме в понеделник.
[Аплауз]
>> [CS50.TV]