[Powered by Google Translate] [Тиждень 5] [David J. Малан, Гарвардський університет] [Це CS50.] [CS50.TV] [Жінка] Він бреше, про що, я не знаю. [Чоловік] Отже, що ми знаємо? [Жінка] Що в 9:15, Рей Сантойя було в банкоматі. [Чоловік] Так що питання, що він робив в 9:16? [Жінка] Зйомки 9 мм на щось. Може бути, він побачив снайпера. [Чоловік] Або він працює з ним. [Жінка] Почекайте. Повернення на один. [Чоловік] Що ви бачите? [♫ ♫ тривожної музикою] [Жінка] Принесіть свій лицьовою стороною вгору. Повний екран. [Чоловік] Його окуляри. >> Там у відображенні. [♫ ♫ тривожної музикою] [Чоловік] Ось бейсбольної команди Nuevita в. Це їхній логотип. [Жінка] І він говорить тому, хто носить цю куртку. [David Malan] Таким чином, це CS50 тиждень 5, і сьогодні ми зруйнує трохи телебачення і кіно для вас. Тому, коли ви дивитеся шоу, як це тут, і поліцейські говорять "можете ви чистити, що до?" або "Підвищити" немає ніякого поліпшення в реальному світі. У самому справі, те, що ви дійсно отримаєте трохи щось на зразок цього. Я під'їхав один із співробітників, фотографії зі сторінки. Це програма під назвою Photoshop. Це 1 з 2 Bowdens, 1 з 3 Bowdens насправді, на сьогоднішній день, тому що у нас місіс Боуден тут же, разом з Робом і Павла. Але от Роб на екрані, і якщо ми збільшимо на цей спалах, він завжди був у його очах, те, що ви насправді бачите, що те, що ви бачите, що ви отримуєте. Це "посилена", тому "CSI" у мене трохи не так. Там один другого кліпу, якщо ми можемо забрати на "CSI" просто трохи довше. Це одна хороша фраза вимовити відтепер, якщо ви хочете обгрунтовані технічні зі своїми друзями, коли, дійсно, ви говорите, абсолютно нічого. [Чоловік] Протягом декількох тижнів я був розслідування вбивства вбивця таксиста з певним захопленням болючим. [Woman # 1] Це в реальному часі. [Жінка # 2] Я створю GUI інтерфейс з використанням Visual Basic, бачити, якщо я можу відслідковувати IP-адреси. [Малан] Так аудіо з синхронізації в сторону, створивши графічний інтерфейс з використанням Visual Basic відслідковувати IP-адреси повна дурниця. У ці дні ви не будете використовувати Visual Basic, немає необхідності в GUI, і IP адреса була технічно точний термін. Так що стежте за цим, і один з моїх улюблених: Це одна трохи більше таємницею, тому що ви повинні знати іншу мову. Там є мовою під назвою Objective-C, який є розширенням C. Що означає, що C плюс деякі додаткові можливості, в тому числі об'єктно-орієнтованого програмування. І це мова, якою Apple, популяризував для програмування IOS. І так ось уривок з різних шоу в цілому, від "Числа", що, якщо ви дійсно подивіться уважно на вашому TiVo і паузи в потрібний момент, Ви побачите, що те, що вони дивляться на не зовсім те, що описано. І дозвольте мені спробувати різні аудіо роз'єм тут і подивитися, якщо ми не можемо зберегти аудіо в синхронізації на цей раз. Я даю вам "Числа". [Людина № 1] Це 32-розрядний адреса IPv4. [Чоловік # 2] IP, це Інтернет. >> Приватної мережі. Це приватна мережа Аніти. [Малан] Добре. Це Objective-C, і це для фарбування деяких програм малюка, як ви, можливо, може укласти від імені змінну. Так що ж тоді "Числа". Тому сьогодні і на цьому тижні ми вводимо Трохи світі судово-медичної експертизи та контекст, в проблемах тому. Сьогодні буде скорочено лекцію, бо є спеціальний захід тут після цього, тому ми будемо заглянути, і дражнити як студентів, так і їх батьків сьогодні з деякими з речей, які на горизонті. Серед них, як у понеділок, у вас буде ще кілька однокласників. EDX, Гарвард і MITs новий онлайн ініціативи для відкритої курсів і більше, запуск на кампусі Гарвардського університету в понеділок. Це означає, прийшов понеділок у вас буде - за станом останніми підрахунками, 86000 додаткових однокласники будуть стежити поряд з лекціями в CS50 і розділів і покрокові керівництва і проблема множин. І як частина цього, ви станете членами першого класу CS50 і тепер CS50x. В рамках цього, зараз, розумію, що там будуть якісь позитивні моменти, а також. Щоб підготуватися до цього, для величезної кількості студентів, Досить сказати, що, хоча у нас є 108 TFs і сертифікації, не зовсім кращий учень / вчитель одного разу ми потрапили 80000 інших студентів. Таким чином, ми не збираємося бути сортування стільки проблема встановлює вручну. Таким чином, представив на цьому тижні в задачі набір буде CS50 перевірки, який буде утиліта командного рядка всередині приладу що ви отримаєте, як тільки ви відновите його пізніше в ці вихідні, і ви будете мати можливість запускати команди, перевірте 50, на свій PSET, і ви отримаєте зворотний зв'язок стосовно того, ваша програма правильно чи неправильно у відповідності з різними специфікаціями дизайну, які ми надаємо. Так про це і специфікації проблема набору та CS50x однокласники будуть використовувати його. Таким чином, проблема комплект 4 це все про криміналістиці. І цей шматок був натхненний деякі реальні речі, якому, коли я був в аспірантурі, я інтерновані на якийсь час з Управління Middlesex округу окружного прокурора робить судово-медичної експертизи з їх ведучим судовим слідчим, і що це склало це, я думаю, я вже повз декількох тижня, маса Державної поліції або інших увійде, вони йдуть такі речі, як жорсткі диски і компакт-диски та дискети і т.п., а потім мета офіс експертизи було впевнитися в тому, було чи не було доказів якийсь. Це був Спеціальна слідча група, так що білих комірців злочину, вона була більш тривожною роду злочинів, нічого участю деяких видів цифрових носіїв, виявляється, що не так багато людей написати електронний лист, кажучи: "Я зробив це". Так що досить часто ці пошуки експертизи не з'явився усе, що багато фруктів, але іноді люди будуть писати такі листи. Так що іноді зусилля були винагороджені. Але доводити до цього судово PSET, ми будемо представляти у PSET 4 трохи графіки. Таким чином, ви, ймовірно, взяти ці речі само собою зрозуміле, JPEG, GIF і як у ці дні, але якщо ви дійсно думаєте про це, зображення, так само, як особа Роба, можуть бути змодельовані у вигляді послідовності точок, або пікселів. Тепер, у випадку особі Роба, є всі види квітів, і ми почали бачити окремі точки, otherwide відомі як пікселі, як тільки ми почали, щоб збільшити масштаб Але якщо ми спростимо світі небагато, і просто сказати, що це ось Роб в чорно-білому, так, щоб представити чорно-білу ми можемо просто використовувати бінарний. І якщо ми збираємося використовувати двійковий, 1 або 0, ми можемо висловити це ж зображення усміхнене обличчя Роба з цієї картини бітів: 11000011 являє білий, білий, чорний, чорний, чорний, чорний, білий. І це не величезний стрибок, то, щоб почати говорити про барвистих фотографій. Речі, які ви бачите на Facebook або взяти з собою цифрову камеру, але, звичайно, коли справа доходить до квітів, вам потрібно більше бітів. І вельми поширені в світі фотографії є ​​використання не є 1-бітний колір, так як це передбачає, але 24-бітний колір, де ви фактично отримуєте мільйони квітів. Так як у випадку, коли ми збільшено на очі Роба, , Що було будь-яку кількість мільйони різних барвистих можливостей. Таким чином, ми введемо це проблема набору 4, а також у керівництві який буде сьогодні в 3:30 замість звичайного 2:30, тому що лекції п'ятницю тут. Але відео буде в режимі онлайн, як зазвичай, завтра. Ми також познайомимо вас з інший формат файлу. Так що це навмисно повинна виглядати лякаючим на перший, Але це тільки деякі документи для структури C. Виявляється, Microsoft, багато років тому, сприяв популяризації цього формату, називається растровий формат, BMP, і це було супер-простий, барвистий графічний формат файлу, який був використаний протягом деякого часу а іноді ще для шпалер на робочих столах. Якщо ви думаєте, повернутися до Windows XP і пагорбів та блакитного неба, , Що було типово BMP, або растрових зображень, і растрові зображення задоволення для нас, тому що у них є трохи більше складності. Це не так просто, як це сітка з 0 і 1; Замість цього, у Вас є такі речі, як заголовок на початку файлу. Отже, іншими словами, всередині. Файлів BMP являє собою цілий букет з 0 і 1, але є деякі додаткові 0 і 1 в там. І виходить, що те, що ми, ймовірно, саме собою зрозумілим протягом багатьох років, формати файлів, як. документ або. або XLS. mp3 або. mp4, всі формати файлів, які ви знайомі з. Ну, і що це взагалі значить бути формат файлу? Тому що в кінці кінців, всі ці файли, які ми використовуємо, мають тільки 0 і 1 і, можливо, ці 0 і 1 уявляють, B, C, через ASCII і т.п., але до кінця дня, це тільки 0 і 1. Таким чином, люди просто іноді вирішили винайти новий формат файлів де вони стандартизації, які моделі біт буде насправді маю на увазі. І в цьому випадку тут, люди, які розроблені растровий формат Кажуть, що в самий перший байт в растровий файл, як позначати зсув 0, то, там будуть деякі зашифровані імена змінної bfType, який просто стоїть для растрових типів файлів; якого типу файл зображення цього. Можна зробити висновок, мабуть, з другого ряду, що зсув 2, байт номер 2, має малюнок з 0 і 1, яка являє що? Розмір і те, і це йде звідти. Таким чином, у проблемі набір 4, ви будете пройшов через деякі з цих речей. Ми не будемо в кінцевому підсумку турбота про всі з них, але помітити це починає ставати цікавим навколо лінії або байт 54, rgbtBlue, зелений і червоний. Якщо ви коли-небудь чули акронім RGB, червоний зелений синій, це посилання на це. Бо виходить, ви можете малювати всі кольори веселки з деякою комбінацією червоного і синього і зеленого. І справді, батьки в залі могли б згадати деякі з найбільш ранніх проекторів. У ці дні, ви бачите лише один яскравий світло, що виходить з об'єктива. Але повернемося в день, ви були червоні лінзи, блакитні лінзи і зелені лінзи і вони разом, спрямованої на екрані і сформував барвисту картину. І досить часто середніх шкіл і вузів матимуть ті лінзи все так трохи криво, так що ви були свого роду бачимо подвійні або потрійні зображення, але це була ідея. Ви були червоний і зелений і синій світло намалювати картину. І той же самий принцип використовується в комп'ютерах. Таким чином, серед проблем, то для Вас в проблемі встановити 4 збираються бути кілька речей, одна є насправді змінити розмір зображення. Для того, щоб в шаблоні від 0 і 1, з'ясувати, які шматки 0 і 1 представляють те, що в структурі, як це, , А потім з'ясувати, як повторити пікселів: червоні, сині, зелені всередині так, що, коли картина виглядає так спочатку, може виглядати так, а не після цього. Серед інших проблем, теж буде, що ви будете передані судово образ сам файл з цифрової камери і на цій камері, колись, було ціла купа фотографій. Проблема в тому, ми випадково стерті або був образ пошкоджений якимось чином. Погані речі трапляються з цифрових камер, і тому ми швидко скопіювали всі з 0 і 1 з цією картою для вас, зберегти їх усі в один великий файл, а потім ми будемо передавати їх для вас У завдання встановити 4, так що ви можете написати програму в C, з якою відновитися всі ці зображення у форматі JPEG, в ідеалі. І виявляється, що JPEG, навіть якщо вони чимось складним форматом файлу, вони набагато більш складною, ніж це усміхнене обличчя тут. Виходить, що кожен JPEG починається з тих же моделей від 0 і 1. Таким чином, використовуючи петлю, або цикл або аналогічний, Ви можете перебрати всі 0 і 1 в цій судовій зображення і кожного разу, коли ви бачите спеціальний шаблон, який визначений в специфікації проблема набору, Ви можете припустити: "Ах, ось, з дуже високою ймовірністю, Початок JPEG, і як тільки ви знайдете за тією ж схемою, деяка кількість байтів або кілобайтах або мегабайтах пізніше, Ви можете припустити, 'О! Ось другий JPEG, фото я взяв після того, як перший. Дозвольте мені зупинитися читав, що перший файл, почати писати цей новий ". І вихід з вашої програми для PSET 4 буде цілих 50 JPEG. А якщо це не 50 JPEG, у вас є трохи циклу. Якщо у вас є нескінченна кількість JPEG, у вас є нескінченний цикл. Так що, теж буде досить поширений випадок. Ось що на горизонті. Вікторина 0, позаду нас. Зрозумійте, на мою електронну пошту, яка незмінно є люди , Які обидва щасливі, як би нейтральною, і сумні навколо вікторина 0 раз. І, будь ласка, дотягнутися до мене, керівник ТФ, Zamyla, ваші власні TF або одного з центрів сертифікації, які ви знаєте, якщо ви хотіли б обговорити, як все пройшло. Таким чином, щоб справити враження на батьків тут, у кімнаті, що CS50 бібліотеку? Хороша робота. Що CS50 бібліотеку? Так? [Відповіді студентів, нерозбірливо] >> Гаразд, добре. Так що це Стандартна набір коду, який ми, співробітники, писав, ми надаємо вам, щоб забезпечити деякі загальні функціональні можливості. Такі речі, як мені отримати рядок, зрозумійте мене INT, всі функції, перераховані тут. Починаючи з цього моменту, ми починаємо по-справжньому взяти ці навчальні колеса геть. Таким чином, ми збираємося почати, щоб забрати "рядок" від вас, який, нагадаємо, був всього лише синонім, що фактичний тип даних? символ *. Таким чином, для батьків, які, ймовірно, - це добре, так що символ *, ми починаємо бачити На екрані тим більше, що ми видаляємо "рядок" з нашого лексикону, принаймні коли справа доходить до фактичного написання коду. Крім того, ми будемо відмовитися від використання деяких з цих функцій стільки ж, тому що наші програми збираються отримати більш складні , А не просто писати програми, які сидять там із запитом блимати, очікування для користувача, щоб ввести щось дюйма Ви будете отримувати ваші матеріали з інших джерел. Наприклад, Ви будете отримувати їх з послідовності бітів на локальному жорсткому диску. Ви, а не отримувати їх в майбутньому від мережі, деякі веб-сайт десь. Так що давайте відігніть цей шар в перший раз, і потягніть вгору CS50 приладу і цей файл називається CS50.h, що ви були різкими, включаючи кілька тижнів. Але давайте реально побачити, що знаходиться всередині цього. Таким чином, у верхній частині файлу в синьому це просто ціла купа коментарів, Інформація ліцензування та гарантії. Це свого роду загальну парадигму в програмне забезпечення, тому що багато програмного забезпечення в ці дні те, що називається "з відкритим початковим кодом», Це означає, що хтось написав код і зробив це у вільному доступі, а не просто бігати і використовувати, але насправді читати і змінювати та інтегрувати в свою роботу. Так от що ви використовуєте програмне забезпечення з відкритим джерелом, хоча і в дуже малій форми. Якщо я прокрутіть вниз повз коментарів, хоча, ми починаємо бачити деякі більш знайомі речі. Так помітити у верхній тут, що файл CS50.h включає в себе цілу купу файлів заголовків. Зараз більшість з них ми раніше не бачили, але одне знайомі, які з них ми не бачили, хоча й ненадовго, до цих пір? Так, стандартні бібліотеки. Stdlib.h має Танос, тому, як тільки ми почали говорити про динамічному розподілі пам'яті, які ми повернемося на наступному тижні, а ми почали в тому числі і файлів. Виявляється, BOOL і істинним і хибним насправді не існує в C, по суті, якщо ви включаєте цей файл тут. Таким чином, ми протягом кількох тижнів, були в тому числі стандартні bool.h так що ви можете використовувати поняття логічне, істинної чи удаваної. Без цього, вам доведеться розібратися підроблених і використовувати Int і просто довільно вважати, що 0 є помилковим і 1 вірна. Тепер, якщо ми прокрутити вниз далі, ось наше визначення рядки. Виявляється, як ми вже говорили раніше, що там, де це * це дійсно не має значення. Ви навіть можете мати простір навколо. Ми, в цьому семестрі, були його популяризації як це зробити зрозуміло, що * має справу з типом. Але розумієте, як загального, якщо не трохи частіше, це поставити його там але функціонально це те ж саме. Але тепер, якщо ми будемо читати далі вниз, давайте подивимося на, скажімо, GetInt, тому що ми використовували, що, може бути, перш ніж що-небудь ще в цьому семестрі. А ось GetInt. Це що? Це прототип. Так часто ми поставили прототипи на вершинах наших. С файлами, але ви також можете помістити прототипи у файли заголовків,. ч файли, як це тут, так що, коли ви пишете деяких функцій що ви хочете, щоб інші люди могли використовувати, а це саме і у випадку з CS50 бібліотеки, Ви не тільки реалізувати свої функції в щось на зразок CS50.c, Ви також помістити прототипи не у верхній частині цього файлу, але в верхній частині заголовка файлу, те, що заголовок файлу є те, що друзі і колеги включають, з гострими включити в свій код. Так що весь цей час ви були в тому числі всі ці прототипи ефективно у верхній частині вашого файлу, але через цей різкий включати механізм , Що істотно копіює і вставляє цей файл у свій власний. Тепер, ось деякі досить докладну документацію. Ми в значній мірі само собою зрозумілим, що GetInt отримує INT, але, виявляється, є деякі окремі випадки, чи не так? Що робити, якщо користувач вводить число, це занадто великий? Квінтильйонів, що просто не може поміститися усередині Int? Яке очікуване поведінка? Ну, в ідеалі, це передбачувано. Таким чином, в цьому випадку, якщо ви насправді читати дрібний шрифт, Ви побачите, що, якщо лінія не може бути прочитаний, це повертає INT_MAX. Ми ніколи не говорили про це, але, грунтуючись на його капіталізації, що це, напевно? Це постійна, так що деякі спеціальні константа, яка, ймовірно, оголосив в одному з цих файлів заголовків ось піднятися вище у файлі, INT_MAX і, ймовірно, щось подібне, приблизно, 2 мільярди доларів. Ідея полягала в тому, що, оскільки ми повинні якимось чином означає, що щось пішло не так, Ми, так, є 4000000000 номери в нашому розпорядженні, негативне 2 млрд. до 2 млрд., плюс-мінус. Ну, те, що є загальним в програмуванні ти вкрав лише один з цих чисел. Може бути 0, може бути, 2 млрд, може бути негативним 2 мільярди доларів. Таким чином, ви витрачаєте одну з ваших можливих значень, так що ви можете зробити в світі що якщо щось піде не так, я поверну цей супер-великого значення. Але ви не хочете, щоб користувач друкує щось загадкове, як "2, 3, 4 ..." дійсно великий номер, де ви узагальнювати, а не як константу. Так насправді, якщо ви були анального останні кілька тижнів, в будь-який час ви дзвоните GetInt, ви повинні були перевірити з, якщо умови. Хіба типу користувача в INT_MAX, або, точніше, GetInt зробив повернення INT_MAX? Тому що якщо це так, що насправді означає, що вони не вводьте його, щось пішло не так в цьому випадку. Отже, це те, що зазвичай називають "дозорних" значення, яке просто означає, особливий. Ну, давайте тепер звернемося до служби. С файлами. Файл C існувала в прилад протягом деякого часу, і, по суті, прилад має його попередньо скомпільованих для вас в те, що ми називали "об'єктний код" але це просто не має значення для вас, де це тому, що система знає, У цьому випадку, де вона знаходиться, прилад. Але давайте прокрутіть вниз тепер GetInt, і подивитися, як GetInt працював весь цей час. Таким чином, тут ми маємо подібні коментарі, чим колись. Дозвольте мені збільшити тільки на частину коду, і що ми маємо на GetInt полягає в наступному. Він не приймає вхідні і повертає ціле, в той час (правда), так що у нас є навмисне нескінченний цикл але, мабуть, ми вирватися з цього так чи інакше, або повернутися всередині цього. Отже, давайте подивимося, як це працює. Ну, ми, схоже, використовують GetString У цій першій лінією всередині циклу, 166. Тепер це хороша практика, тому що, за яких обставин GetString може повернути це спеціальне ключове слово NULL? Якщо щось піде не так. Що може піти не так, коли ви називаєте щось подібне GetString? Так? [Студент відповідь, нерозбірливо] >> Да. Тому, можливо, Танос не вдається. Десь під капотом GetString кличе Танос, яка виділяє пам'ять, яка дозволяє в комп'ютерний магазин Всі символи, які користувач набирає на клавіатурі. І припустимо, що користувач мав багато вільного часу і набрали більше, наприклад, ніж 2 млрд. символів. Більше символів, ніж комп'ютер, навіть має RAM. Ну, GetString повинен бути в змозі означає, що до вас, навіть якщо це супер, супер рідкісний випадок кутку. Він повинен якимось чином бути в змозі впоратися з цим, і так GetString, якщо ми повернемося і прочитати його документацію, не, насправді, повернути NULL. Тепер, якщо GetString не вдається, повертаючи NULL, GetInt збирається потерпіти невдачу шляхом повернення INT_MAX, як дозорні. Це всього лише людські конвенції. Тільки так ви б знали, що це справа Читаючи документацію. Так що давайте прокрутіть униз, туди, де Int насправді GotInt. Так що якщо я прокрутіть вниз трохи далі, в лінії 170 у нас є коментар вище цих ліній. Таким чином, ми заявляємо, в 172, Int N і символ с, а потім ця нова функція який деякі з вас наткнувся раніше, але Sscanf. Це означає F рядок сканування. Іншими словами, дати мені рядки, і я буду перевірити його на шматки інформації, що представляє інтерес. Так що ж це значить? Ну, припустимо, що я типу в буквальному сенсі 1 2 3 на клавіатурі, , А потім натисніть клавішу ENTER. Що таке тип даних 1 2 3, коли повертаються GetString? Очевидно, що це рядок, чи не так? У мене є рядок, тому 1 2 3 дійсно "1 2 3" з \ 0 в кінці його. Це не Int. Це не число. Це виглядає як число, але це не насправді. Отже, що ж GetInt робити? Це має для сканування цього рядка зліва направо, 1 2 3 \ 0, і якимось чином перетворити його у фактичне число. Тепер ви можете зрозуміти, як це зробити. Якщо ви згадаєте PSET 2, Ви, ймовірно, отримав трохи зручний з Цезарем або Vigenere так що ви можете перебрати рядки, Ви можете конвертувати символів для цілих чисел з вибором. Це ціла велика робота. Чому б не назвати функцію, як Sscanf, що робить це для вас? Так Sscanf очікує аргумент, в даному випадку називається лінія, яка є рядком. Потім ви вказуєте, в лапках, дуже схожий на Printf, Що ви очікуєте побачити в цьому рядку? Те, що я кажу тут, я очікував побачити десяткове число і, можливо, характер. І ми побачимо, чому це так, в один момент. Виявляється, що це позначення зараз нагадує матеріал Ми почали говорити про трохи більше тижня тому. Що таке & N і & C робить для нас тут? [Відповіді студентів, нерозбірливо] >> Да. Він дав мені адресу і адресу п с. Тепер, чому це так важливо? Ну, ви знаєте, що з функціями C Ви завжди можете повернути значення не має ніякого значення взагалі. Ви можете повернути ціле число, рядок, число з плаваючою точкою, символ, що завгодно. Або ви можете повернутися порожнечу, але ви можете повернути тільки 1 річ максимально. Але тут ми хочемо Sscanf повернути мене, може бути, ціле число, десяткове число, а також символ, і я поясню, чому символів в хвилину. Отже, ви хочете ефективно F повернути 2 речі, які просто не можливо в C. Таким чином, ви можете обійти, що, переходячи в 2-адрес, тому що як тільки ви передати функції 2 адреси, що може цю функцію з ними робити? Він може писати на ці адреси. Ви можете використовувати операцію * і "туди" до кожного з цих адрес. Це зразок цього бекдор механізм, але дуже часто змінюються значення змінних більше, ніж просто 1-е місце, в цьому випадку 2. Тепер зверніть увагу, я перевірки == to1, а потім повертаються п якщо це, насправді, оцінити до істини. Так що ж відбувається? Ну, технічно, все, що ми дійсно хочемо, відбудеться в GetInt це. Ми хочемо, щоб розібрати, так би мовити, ми хочемо, щоб прочитати рядок "1 2 3" і, якщо вона виглядає як є ряд там, те, що ми говоримо Sscanf зробити, це покласти цей номер, 1 2 3, в цій змінній п, для мене. Чому ж тоді у мене це, а? Яка роль також говорять, Sscanf, ви можете також отримати символ тут. [Студент кажучи, нерозбірливо] >> Не - десяткова крапка може працювати. Давайте вважати, що на мить задумався. Що ще? [Студент, нерозбірливо] >> Так, хороші думки, вона може бути нульовою символ. Це насправді не в цьому випадку. Так? [Студент, нерозбірливо] >> ASCII. Або, дозвольте мені узагальнювати ще далі. % C існує тільки для перевірки помилок. Ми не хочемо там бути символ після номера, але те, що це дозволяє мені зробити наступне: Виявляється, що Sscanf, крім зберігання значень в н і с, в цьому прикладі, що він також робить це повертає кількість змінних покласти значення дюйма Так що якщо ви тільки ввести 1 2 3, то тільки% D буде відповідати і тільки п отримує зберігається із значенням, як 1 2 3 і нічого не отримує покласти в C; Із залишається сміття значення, так би мовити. Сміття, тому що він ніколи не був ініціалізований як деяку цінність. Так що в цьому випадку, Sscanf повертає 1, тому що я населений один з тих покажчиків, У цьому випадку, велика. У мене є ціле число, так що я звільнить лінію, щоб звільнити пам'ять GetString, що насправді виділяється, а потім повернутися з. В іншому випадку, якщо ви ніколи не замислювалися, де це повторити заяву приходить, приходить прямо звідси. Якщо, навпаки, я набираю в 1 2 3 Фу, лише деякі випадкові послідовності тексту, Sscanf буде бачити, ох, номер, ох, номер, ох, номер, ох - ф. І він збирається поставити 1 2 3 російською мовою. Він збирається поставити е в с, а потім повернути 2. Отже, ми маємо, тільки за допомогою основного визначення поведінки SCANF, в Дуже простий спосіб - добре, складні на перший погляд, але, врешті-решт, досить простий механізм кажучи, є ціле число, і якщо так, то, що єдине, що я знайшов? І білий простір тут не випадково. Якщо ви прочитали документацію по Sscanf, він говорить вам, що якщо ви включаєте шматок пробіли на початку або в кінці, Sscanf занадто дозволить користувачеві, з якої причини, щоб вразити пробіл 1 2 3, і це буде законно. Він не буде кричати на користувачів тільки тому, що вони потрапили в пробілу на початку або в кінці кінців, які лише трохи більш зручним для користувачів. Будь-які питання, то, по GetInts? Так? [Студент питання, нерозбірливо] >> Хороше питання. Що робити, якщо ви тільки що ввели в символ, як і F, і натисніть Enter ніколи не вводити 1 2 3; що ви думаєте поведінку цього рядка коду б тоді? Так Sscanf може покрити, що теж, тому що в цьому випадку, він не збирається заповнити N або С; він збирається замість повернення 0. У такому випадку, я також ловити цей сценарій, тому що очікуване значення я хочу 1. Я хочу тільки 1, і тільки 1 річ, щоб бути заповнені. Хороше питання. Інші? Гаразд, давайте не будемо пройти через всі функції тут, але той, який, здається, може бути, відсотки, що залишилися в GetString, тому що виявляється, що GetFloat, GetInt, GetDouble, GetLongLong всі плоскодонки багато їх функціональність GetString. Отже, давайте поглянемо на те, як він реалізується тут. Це виглядає трохи складним, але він використовує ті ж основи що ми почали говорити про минулого тижня. Таким чином, в GetString, який не приймає аргументів, як у порожнечу тут, і він повертає рядок, так я оголошую рядка називається буфером. Я дійсно не знаю, що це збирається бути використаний для ще немає, але ми будемо бачити. Схоже потужності, за умовчанням 0; не зовсім впевнений, де це відбувається. Не впевнений, що п збирається бути використаний для клієнтів. Але зараз це стає трохи більш цікавою, так і в лінії 243, ми заявляємо Int C, це свого роду дурні докладно. Символ це 8 біт і 8 біт може зберігати скільки різних значень? 256. Проблема в тому, якщо ви хочете мати 256 різних символів ASCII, яке є, якщо ви озирнетеся, і це не те, щоб запам'ятати. Але якщо ви згадаєте, що велика ASCII графіку ми були тиждень тому, було, в такому випадку, 128 або 256 ASCII символів. Ми використовували всі моделі 0 і 1 справа. Це проблема, якщо ви хочете бути в змозі виявити помилку. Тому що, якщо ви вже використовуєте 256 значень для ваших персонажів, Ви дійсно не планувати заздалегідь, тому що зараз у вас немає можливості сказати, "Це не законно характер, це якесь помилкове повідомлення". Так що світ робить це, вони використовують наступний найбільша цінність, щось на зразок Int, так що у вас є божевільні число бітів, 32 на 4 млрд. значень, так що ви можете просто в кінцевому підсумку, використовуючи, по суті, 257 з них, 1 з яких має деяке особливе значення як помилку. Отже, давайте подивимося, як це працює. Відповідно 246, у мене є цей великий цикл при , Який викликає fgetc, е значення файлу, ЕОКП, а потім стандартного вводу. Виявляється, це всього лише більш точним способом сказати "читати введення з клавіатури". Стандартна клавіатура засобів введення, стандартний висновок означає, екран, і стандартні помилки, які ми побачимо в PSET 4, означає, що екран, але особлива частина екрану, так що вона не змішується з фактичним виходом, що ви призначені для друку, але про це в майбутньому. Так fgetc просто означає, що читати один символ з клавіатури, і зберігати його де? Зберігайте його в C, а потім перевірити, так що я просто використовуючи деякі логічні сполучники тут, переконайтеся, що вона не дорівнює \ п, так що користувач натисніть Enter. Ми хочемо зупинити в той момент, кінець циклу, і ми також хочемо, щоб перевірити для спеціальних постійної, EOF, яка, якщо ви знаєте або вгадати - що це означає? Кінець файлу. Так що це вид безглуздо, тому що, якщо я друкую на клавіатурі, там дійсно немає файлу, що беруть участь в цьому, Але це всього лише свого роду загальний термін, використовуваний для позначення що нічого не приходить з пальця людини. EOF. Кінець файлу. Як осторонь, якщо ви коли-небудь вдарив управління D на вашій клавіатурі, Не, що ви б ще, ви потрапили контроль з. Але контроль г посилає це спеціальна константа називається EOF. Отже, тепер ми просто є деякі динамічного розподілу пам'яті. Так що, якщо п + 1> потужностей, зараз я поясню, с. п, скільки байт в даний час в буфері, Рядок, ви в даний час нарощування від користувача. Якщо у вас є декілька символів в буфері, ніж у вас є потенціал в буфер, інтуїтивно, що ми повинні зробити, це виділити більше потужності. Я хочу, щоб ковзати над деякими арифметичної тут і зосередитися тільки на цій функції тут. Ви знаєте, що Танос є, або принаймні в цілому знайомі. Візьміть припущення, що перерозподілити робить. [Студент відповідь, нерозбірливо] >> Да. І це не зовсім додавання пам'яті, вона перерозподіляє пам'ять наступним чином: Якщо є ще місце в кінці рядка, щоб дати вам більше, що пам'ять ніж це спочатку дає вам, то ви отримаєте, що додаткова пам'ять. Таким чином, ви можете просто покласти рядки символів спиною до спини, щоб спина до спини. Але якщо це не так, тому що ви занадто довго чекали і щось випадкове отримав шльопнулася в пам'ять існує, але є додатковий пам'ять тут, внизу, це нормально. Realloc буде робити всю важку роботу за вас, перемістити рядок, яку ви читали в так далеко звідси, покласти його туди, а потім дати вам ще кілька злітно-посадкової смуги в цій точці. Так що з хвилею боку, дозвольте мені сказати, що те, що робить GetString воно починає з невеликою буфер, може бути, 1 одиночний символ, і якщо користувач вводить в 2-х символів, GetString закінчується виклику перерозподілити і каже: "О, 1 символів було недостатньо. Дайте мені 2 символів. Тоді, якщо ви прочитали логіці циклу, він збирається сказати: "Ох, користувач вводить в 3 символів. Дайте мені тепер не 2, а 4-х символів, то дай мені 8, то дайте мені 16 і 32. Той факт, що я подвоєння потужності кожного разу означає, що буфер не буде рости повільно. Він буде рости супер швидкий, і що могло б бути перевагою, що? Чому я подвоєння розміру буфера, навіть якщо користувач може просто потрібно 1 додатковий символ з клавіатури? [Студент відповідь, нерозбірливо]. >> Що це таке? Саме так. Ви не повинні рости так часто. І це тільки частково - ти хеджування ставки тут. Ідея в тому, що ви не хочете подзвонити перерозподілити багато, тому що він має тенденцію бути повільним. Кожен раз, коли ви запитаєте операційної системи для пам'яті, як ви скоро побачите, У майбутньому поставленого завдання, він прагне зайняти деякий час. Таким чином, мінімізація, що кількість часу, навіть якщо ви витрачаєте деякий простір, як правило, добре. Але якщо ми прочитали фінальну частину GetString тут, і знову, розуміючи, кожна лінія тут не так важлива сьогодні. Але зверніть увагу, що в кінцевому рахунку викликає Танос знову, і він виділяє рівно стільки байт, скільки йому потрібно для рядка , А потім викидає по телефону вільно, занадто великі буфера, якщо він дійсно отримав подвоїв занадто багато разів. Коротше кажучи, ось як GetString працював весь цей час. Все це робить читання одного символу в той час, знову і знову і знову і кожного разу, коли вона потребує деякої додаткової пам'яті, вона запитує операційної системи для її виклику перерозподілити. Є питання? Добре. Атаці. Тепер, коли ми розуміємо, покажчиків, або принаймні все більше і більше знайомі з покажчиками, давайте розглянемо, як весь світ починає розвалюватися якщо ви не зовсім захистити від змагального користувачів, люди, які намагаються зламати вашу систему. Люди, які намагаються вкрасти ваші програми в обхід деяких реєстраційний код що вони могли б в іншому випадку доведеться вводити дюйма Погляньте на цей приклад тут, який знаходиться всього в C код , Який має функцію основного внизу, яка викликає функцію Фу, і для чого він переходячи до Foo? [Студент] один аргумент. >> Одного аргументу. Так ARGV [1], що означає перше слово, введений користувачем У командному рядку після a.out або будь-який інший програми, називається. Так Фу, у верхній частині, бере на символ *, а символ * тільки що? String. Там немає нічого нового тут, і що рядки довільної називатися баром. У цій лінії тут, символ з [12], в роді напів-технічної англійської мови, те, що ця лінія робить? Масив -? Персонажі. Дайте мені масив з 12 символів. Таким чином, ми могли б назвати це буфер. Це технічно називається C, а буфер в програмуванні просто означає, купа простору, які можна покласти деякі речі дюйма Тоді, нарешті, тетсру, ми не використовували раніше. Але ви можете здогадатися, що він робить. Він копіює пам'яті. Що він робить? Ну, це мабуть копіює бар, на вході, в с, але тільки до довжини бар. Але є помилка тут. Гаразд, так що технічно ми дійсно повинні зробити StrLen (бар) х SizeOf (Char), це правильно. Але в гіршому випадку тут, давайте припустимо, що that's - значить, все в порядку. Тоді є 2 помилки. Таким чином, SizeOf (Char), все в порядку, давайте зробимо це трохи ширше. Так що тепер є ще помилка, що є що? [Студент відповідь, нерозбірливо] >> перевірки для чого? Отже, ми повинні перевіряти для NULL, тому що погані речі трапляються, коли ваш покажчик NULL, Тому що ви могли б у кінцевому підсумку відбувається там, і ви ніколи не повинні йти в NULL шляхом разименованія його з оператором *. Так що добре, а що ще ми робимо? Логічно є недолік тут. [Студент відповідь, нерозбірливо] >> Так що перевірити, якщо агдс ≥ 2? Отже, є 3 помилки в цій програмі. Ми не перевіряє, якщо користувач набрав насправді ні в чому в ARGV [1], добре. Так що третя помилка? Так? [Студент відповідь, нерозбірливо] >> Добре. Таким чином, ми перевірили одним сценарієм. Ми неявно перевірити, не копіюйте більше пам'яті ніж буде перевищувати довжину бару. Таким чином, якщо рядок користувач вводить в складається з 10 символів, це говорить: «Тільки копіювання 10 символів. І це добре, але що робити, якщо користувач вводить в слово в рядку як 20 символів слова, це, кажучи копії 20 символів з бару у що? С, інакше відомий як наш буфер, який означає, що ви тільки що написали дані до 8 байт місць, які вам не належать, і ви не володієте їм в тому сенсі, що ви ніколи не виділяла їх. Отже, це те, що зазвичай називають атаку на переповнення буферу, або переповнювання буфера атаку, і його атаки в тому сенсі, що якщо користувач або програми, яка телефонує ваша функція робить це зловмисно, що насправді відбувається далі може бути зовсім погано. Давайте поглянемо на цю картину тут. Ця картина представляє свій стек пам'яті. І нагадаємо, що кожен раз, коли ви викликаєте функцію, Ви отримуєте цю маленьку кадрів в стек, а потім інший, а потім інший, а потім іншу. І досі ми тільки вид цих відведеної геть, як прямокутники або є, на дошці або на екрані тут. Але якщо збільшити на один з цих прямокутників, При виклику функції Foo, виявляється, що це ще не все в стеку всередині цього кадру і цей прямокутник ніж просто х і у, а і Ь, як ми зробили говоримо про своп. Виявляється, що є деякі низькорівневі деталі, Серед них зворотної адреси. Ось і виходить, коли основні називає Фу, основна повинен повідомити Foo яку адресу основного знаходиться в оперативній пам'яті комп'ютера. Тому що інакше, як тільки Foo робиться виконання, як в даному випадку тут, як тільки ви досягнете цього тісного фігурною дужкою в кінці Фу, як, чорт візьми ніяк Foo знає, де контроль над програмою повинна йти? Виявляється, що відповідь на це питання в тому, що червоний прямокутник тут. Це являє собою вказівник, і це до комп'ютера для зберігання, тимчасово, на так званому стеку адресу основного, так що, як тільки Foo робиться виконання, Комп'ютер знає, де і які лінії в основному, щоб повернутися в. Збережено покажчик кадру відноситься так само до цього. Char * бар тут представляє те, що? Ну, а тепер ця синя сегмент тут кадр Foo, то що знаходиться бар? Отже, бар просто аргумент функції Foo. Так що тепер ми повернулися на знайому картину. Там більше речей і більше відволікатися на екрані але це блакитний сегмент є те, що ми були малювання на дошці щось подібне підкачки. Це рамка для Foo і єдине, що в ній прямо зараз, бар, які цим параметром. Але що ще має бути в стеку, у відповідності з цим кодом тут? Char C [12]. Таким чином, ми повинні також бачити 12 квадратів пам'яті, , Що виділяються на змінну с. І дійсно, у нас є, що на екрані. У самому верху є з [0], а потім автор цієї схемою не турбувати малювання всі квадрати, але насправді є 12 є тому що якщо ви подивитеся на нижню праву, з [11], якщо вважати від 0, 12 таких байт. Але ось у чому проблема: в якому напрямку зі зростаючою? Вид зверху вниз, чи не так? Якщо він починається у верхній і росте на дно, Не схоже ми залишили собі багато злітно-посадкової смуги тут взагалі. Ми видів забарвлені себе в кут, і що з [11] впритул барі, який знаходиться прямо проти покажчика стека кадру, який знаходиться прямо проти зворотної адреси; немає більше місця. Так у чому ж наслідки, то, якщо ви зіпсувати, а ви спробуйте прочитати 20 байт в 12-байт буфера? Де ці 8 додаткових байтів йти? Усередині все інше, деякі з яких це супер важливо. І найголовніше, можливо, є червона коробка там, зворотну адресу. Тому припустимо, що ви випадково або adversarially перезаписати ці 4 байти, що покажчик адреси, не тільки зі сміттям, але з багатьма, що відбувається представляють фактичну адресу в пам'яті? Що implicaiton, логічно? [Відповіді студентів, нерозбірливо] >> Саме так. Коли Foo повертається і хіти, які фігурною дужкою, програма буде виходити не повернутися до основної, він збирається повернутися в будь-яку адресу в тому, що червоні коробки. Тепер, у випадку обходу реєстрації програмного забезпечення, що це адреса який повертається в це функція , Який зазвичай викликається після того, як ви заплатили за програмне забезпечення і вводиться реєстраційний код? Ви можете сортувати трюк комп'ютер в не збираємося тут, але замість цього збираються тут. Або, якщо ви дійсно розумний, противник дійсно може ввести на клавіатурі, Наприклад, не фактичні слова, не більше 20 символів, але припускаю, що він або вона У деяких типах символів, які представляють код? І це не буде З-код, він буде символи , Які являють собою двійковий машинний код, 0 і 1. Але припустимо, що вони достатньо розумні, щоб зробити це, щоб хоч якось вставити в рядок GetString те, що по суті скомпільований код, і останні 4 байти перезапису, що зворотну адресу, і те, що адреса не що вхідний робити? Він зберігає в цьому червоному прямокутнику адреса першого байта буфера. Таким чином, ви повинні бути дуже розумним, і це багато проб і помилок для поганих людей там, але якщо ви можете з'ясувати, наскільки великий цей буфер, такі, що за останні кілька байт у вхідний які ви надаєте програмі виявитися еквівалентної адресу початку вашого буфера, Ви можете зробити це. Якщо ми говоримо, як правило, привіт, і \ 0, це те, що потрапляє в буфер. Але якщо ми більш розумні, і ми заповнюємо цей буфер з тим, що ми називаємо загальним шкідливий код, A, A, A, A: атака, атака, атака, атака, де це тільки те, що робить щось погане. Ну, а що трапиться, якщо ви дійсно розумні, ви можете зробити це: У червоній коробці тут послідовність чисел: 80, CO, 35, 08. Зверніть увагу, що збігається з числом це тут. Це в зворотному порядку, але про це якось іншим разом. Зверніть увагу, що цей зворотну адресу був навмисно змінений рівним адресою тут, а не адресу основного. Таким чином, якщо поганий хлопець супер розумний, він або вона збирається включити в цей шкідливий код щось на кшталт: «Видаліть всі файли користувача. Або «Скопіювати паролі" або "Створення облікового запису користувача, що я можу ввійти в. Все що завгодно, і це як небезпеку і силу C. Тому що у вас є доступ до пам'яті через покажчики і тому ви можете написати все, що завгодно в пам'ять комп'ютера. Ви можете зробити комп'ютер робити все, що хочуть просто те, що стрибати у своєму власному просторі пам'яті. І так, по сей день, так багато програм і так багато сайтів, які виявляються під загрозою зводяться до людей скористатися цим. І це могло б бути схожим на супер-складних атак, але це не завжди починаються саме так. Реальність така, що те, що погані люди, як правило, зробити це, будь то програми в командний рядок або графічний інтерфейс програми або веб-сайт, вам просто почати надання дурниця. Ви вводите в дійсно великій слово в поле пошуку та натиснути кнопку введення, і ви чекати, щоб побачити, якщо сайт аварій. Або ви чекаєте, щоб побачити, якщо програма виявляє деяке повідомлення про помилку. Тому що, якщо вам пощастить, як поганий хлопець, і ви надати деякі божевільні вхід, збій програми, це означає, що програміст не очікує вашого поганого поводження яка означає, що ви, ймовірно, може з достатнім зусиллям, Досить проб і помилок з'ясувати, як вести більш точну атаку. Отже, як же невід'ємною частиною безпеки не тільки уникнути цих атак в цілому, але їх виявлення а насправді, дивлячись на журнали і бачачи, що божевільний входів є люди, введені в ваш сайт. Які пошукові терміни людей ввели в свій сайт в надії переповнені деякі буфера? І все це зводиться до простих основ того, що масив, і що це означає для виділення і використання пам'яті? І пов'язані з цим, також, полягає в наступному. Так що давайте просто заглянути всередину жорсткого диска ще раз. Таким чином, ви пам'ятаєте тиждень або два назад, що при перетягуванні файлів в кошики або кошики, що відбувається? [Студент] Нічого. >> Да, абсолютно нічого. Зрештою, якщо ви запустите низькою на диску, Windows або Mac OS почнеться видалення файлів для вас. Але якщо ви перетягнете щось є, то це зовсім не безпечно. Всі ваші Знайомства Пошук Ключові слова, друг або член родини повинен зробити це двічі клікнути мишкою, і вуаля. Там все уривчасті файли, які ви намагалися видалити. Тому більшість з нас принаймні, знаю, що ви повинні натиснути правою кнопкою миші або контролювати і порожній сміття, або щось на зразок цього. Але навіть те, що не зовсім робити свою справу. Тому що те, що відбувається, коли у вас є файл на жорсткому диску , Який представляє якийсь документ, слово або декілька JPEG? І це представляє ваш жорсткий диск, а скажімо, це стрічки тут представляє цей файл, і він складається з цілий букет з 0 і 1. Що відбувається, коли ви не тільки перетягнути цей файл в корзину, або кошики, але й очистити його? Начебто нічого. Це не абсолютно нічого не зараз. Тепер це просто ніщо, тому що дещо відбувається у формі цій таблиці. Таким чином, є свого роду базу даних або таблицю в пам'яті комп'ютера , Що істотно має 1 колонки для імен файлів, і 1 стовпець для розміщення файлів, де це може бути розташування 123, просто випадкове число. Таким чином, ми могли б мати щось подібне x.jpg і місце розташування 123. І що відбувається потім, коли ви спустошити ваш сміття? Це йде. Але те, що не зникає, це 0 і 1. Так що, то, підключення до PSET 4? Ну, з PSET 4, тільки тому, що ми випадково стерті компактні флеш-карти, що були всі ці фотографії, або просто тому, що його невдача стала пошкоджений, не означає, що 0 і 1 є не всі ще там. Може бути, деякі з них втратили, бо щось зіпсувався У тому сенсі, що деяким 0 стало 1 і 1 стало 0 '. Погані речі можуть статися через помилки в програмному забезпеченні або несправність обладнання. Але багато хто з тих бітів, може бути, навіть 100% з них все ще там, це просто, що комп'ютер або камеру не знає, де JPEG 1 почалася і де JPEG 2 почалася, але якщо ви програміст, Знаєте, з трохи здорового глузду, де ці зображення у форматі JPEG або те, що вони виглядають, Ви можете проаналізувати 0 і 1, і кажуть: "О-о. JPEG. Ох, JPEG. Ви можете написати програму по суті тільки для чи під час циклу , Яка відновлює кожен з цих файлів. Так що урок такому випадку, щоб почати "надійно" стирання ваших файлів якщо ви хочете, щоб уникнути цього взагалі. Так? [Студент питання, нерозбірливо] >> Мати більше пам'яті, ніж раніше - О! Хороше питання. Так чому ж тоді, після спорожнення сміття, Ваш комп'ютер скаже вам, що у вас більше вільного простору, ніж ви робили раніше? У двох словах, тому що він бреше. Більш технічно, у вас є більше простору. Тому що зараз ви сказали, ви можете покласти інші речі, де цей файл був колись, але це не означає, що біт йде, і це не означає, біти міняються всі 0, наприклад, для вашого захисту. З іншого боку, якщо ви "надійно" стерти файли або фізично знищити пристрій, , Який дійсно є єдиним способом, а іноді і навколо цього. Так чому б нам не залишити на цьому напів-страшно записку, і ми будемо бачити Вас в понеділок. CS50.TV