[Powered by Google Translate] [Hét 5]
[David J. Malan - Harvard University]
[Ez CS50. - CS50.TV]
>> Ez CS50, 5. héten.
Ma és ezen a héten bemutatjuk egy kicsit a világ kriminalisztika
összefüggésben a probléma készlet 4.
Ma lesz egy rövidített előadás, mert van egy különleges esemény itt utána.
Így lesz egy pillantást, és kötekedik a diákok és a szülők egyaránt ma
néhány, a dolgok, amelyek a horizonton.
>> Közülük, mint hétfőn, akkor néhány osztálytársaival.
EDX, a Harvard és a MIT új online kezdeményezés OpenCourseWare és több,
indít a Harvard egyetemen, hétfőn, ami azt jelenti, gyere hétfő
lesz, mint a tavalyi szám, 86.000 kiegészítő osztálytársai
aki követni együtt CS50 előadásaiból és szakaszok
és walkthroughs és a probléma készletek.
És ennek részeként, akkor tagja lesz az alakuló osztály CS50 és most CS50x.
Ennek részeként most észre, hogy lesz néhány upsides is.
Ahhoz, hogy készen áll erre, a nagy hallgatói létszám,
elegendő annyit mondani, hogy bár van 108 TF és CA,
ez nem egészen a legjobb tanuló-tanár arány, ha elérjük a 80.000 versenyző.
Nem megyünk, hogy osztályozó annyi probléma készletek kézi
így be ezen a héten a probléma meg lesz CS50 Check,
ami lesz parancssori segédprogram belül a készüléket
hogy kapsz ha egyszer frissíti később ezen a hétvégén.
Ön képes lesz futtatni egy parancsot, check50, saját Pset,
és kapsz azonnali visszajelzést arról, hogy a program helyes vagy helytelen
szerint a különböző tervezési előírások általunk biztosított.
Bővebben az, hogy a problémát meg specifikációt.
A CS50x osztálytársai fogják ezt is.
>> Probléma Set 4 szól kriminalisztika,
és ezt Pset igazán ihlette néhány valós dolog
amely koromban posztgraduális iskola I internált egy darabig
A Middlesex megyei kerületi ügyész irodájában csinál törvényszéki munkát
azok vezető törvényszéki nyomozó.
Mi ez az összeg, mert azt hiszem, már említettem, néhány héttel korábban,
ki a Mass állami rendőrség és másokat is jön,
azok leesik dolgok, mint a merevlemezek és a CD-k és floppy lemezek és hasonlók,
majd a cél a törvényszéki hivatal volt, hogy megállapítsa
hogy volt-e, vagy nem volt bizonyíték valami.
Ez volt a különleges vizsgálatok Unit, így volt a fehérgalléros bűnözés.
Ez több volt aggasztó fajta bűncselekmények, bármit magában valamilyen digitális média.
Kiderül, hogy nem, hogy sok ember írjon egy e-mailt mondván: "én tettem."
Szóval elég gyakran, ezek a törvényszéki keresések nem kapcsolja fel az összes, hogy sok gyümölcs,
de néha az emberek levelet az ilyen e-maileket.
Így néha az erőfeszítéseket jutalmazták.
>> De ahhoz, hogy vezet fel e törvényszéki Pset, mi lesz bevezetésével pset4 egy kis grafika.
Valószínűleg ezeket a dolgokat magától értetődőnek - JPEG, GIF, és hasonlók - ezekben a napokban.
De ha igazán belegondolunk, egy képet, ugyanúgy, mint Rob arca,
lehet modellezni sorozatát pontok vagy pixelek.
Abban az esetben, Rob arca, van mindenféle színben,
és elkezdtük, hogy az egyes pontok, más néven pixel,
egyszer elkezdtük a nagyításhoz be
De ha egyszerűsítik a világot egy kicsit, és csak annyit, hogy ez itt Rob a fekete-fehér,
hogy képviselje fekete-fehér, akkor csak használja bináris.
És ha fogunk használni bináris, 1 vagy 0, tudjuk, hogy ezt az ugyanazt a képet
A Rob mosolygó arc ezen minta bit.
11000011 jelentése fehér, fehér, fekete, fekete, fekete, fekete, fehér, fehér.
És ez nem egy hatalmas ugrás, majd kezdeni beszélni színes fényképek,
dolgok, amit látni a Facebook-on, vagy tegyen egy digitális fényképezőgép.
De természetesen, amikor a színeket, akkor kell több bitet.
És elég gyakori a világ fényképek használata nem 1-bites szín,
mivel ez azt sugallja, de 24-bit szín, ahol tényleg kap millió szín.
Szóval, abban az esetben, amikor nagyított részt Rob szemében,
volt bármennyi millió különböző színes lehetőségeket.
Így fogunk bevezetni ezt a Problem Set 4, valamint a walkthrough,
melyik lesz ma 3:30 helyett a szokásos 2:30 mert a pénteki előadás itt.
De a video lesz online szokásos holnap.
>> Majd azt is bemutatni, hogy egy másik fájlformátumban.
Ez azt jelentette, hogy szándékosan nézd félelmetes az első,
de ez csak néhány dokumentumot a C struct.
Kiderül, hogy a Microsoft évekkel ezelőtt segített népszerűsítse ezt a formátumot
az úgynevezett bitmap formátumban, bmp, és ez egy szuper egyszerű, színes grafikus fájlformátum
is használt jó ideje, és néha még a háttérképeket az asztali gépek.
Ha úgy gondolja, vissza a Windows XP és a dombok és a kék ég,
ez jellemzően egy bmp vagy bitmap képeket.
Bitképek szórakoztató számunkra, mert egy kicsit bonyolult.
Ez nem annyira egyszerű, mint ez a rács a 0s és 1s.
Ehelyett a dolgok, mint a fejléc elején egy fájlt.
Más szóval, belsejében egy. Bmp fájl egy csomó 0s és 1s,
de van néhány további 0s és 1s ott.
És kiderül, hogy mi az, amit valószínűleg magától értetődőnek évek óta -
fájlformátumokat, mint a. doc vagy. xls vagy. mp3,. mp4, függetlenül a fájlformátumok
hogy te vagy ismeri - mit is jelent, hogy még egy fájlformátum,
mert a végén a nap el ezeket a fájlokat használjuk imént 0s és 1S.
És talán azok 0s és 1s képviselik ABC keresztül ASCII vagy hasonló,
de a végén a nap, ez még mindig csak 0s és 1s.
Szóval az emberek csak alkalmanként úgy, hogy kitaláljon egy új fájlformátumot
amennyiben azok szabványosítása milyen mintákat bitet jelent valójában.
És ebben az esetben is az emberek, akik célja a bitmap formátum
azt mondta, hogy az első byte egy bitmap fájlt, például jelöljük offset 0 ott,
ott lesz valami rejtélyes nevű nevű változó bfType,
ami csak áll a bitmap fájl típusa, milyen típusú bitmap fájl ezt.
Lehet következtetni, talán a második sorban, hogy az eltolt 2, byte szám 2,
egy minta 0s és 1s képviselő mit? A méret a valamit.
És ez megy onnan.
Tehát a probléma Set 4, akkor meg kell végigsétált néhány ezeket a dolgokat.
Nem fogunk a végén törődve mindet.
De észre kezd érdekes körül byte 54: rgbtBlue, zöld és piros.
Ha valaha is hallotta a betűszó RGB - vörös, zöld, kék - ez egy utalás, hogy a
azért, mert kiderült, hogy tudja festeni a színek a szivárvány
néhány kombinációja piros, kék és zöld.
És valóban, a szülők a szobában lehet felidézni néhány, a legkorábbi projektorok.
Ezek a napok, csak látni egy erős fény jön ki a lencse,
de vissza a nap volt a vörös lencse, a kék lencse, és a zöld lencse,
és együtt, amelynek célja a képernyőn, és megalakította a színes képet.
És gyakran, közép iskolák és főiskolák volna e lencsék
valaha így kicsit ferdén, így volt valami látni dupla vagy tripla képeket.
De ez volt az ötlet. Nem volt piros, zöld és kék fény festő egy képet.
És ez elvet használt számítógépek.
>> Így a feladatok, akkor az Ön számára a probléma Set 4 lesznek néhány dolgot.
Az egyik, hogy valóban átméretezi a képet, hogy a minta 0s és 1s,
kitaláljuk, melyik darabokat 0s és 1s jelentenek mi az a struktúra, mint ez,
majd kitaláljuk, hogyan lehet lemásolni a pixelek - a vörös, a kék, a zöld -
belül annak érdekében, hogy ha egy képet a következőképpen néz ki kezdetben,
lehet, hogy néz ki, hanem azt követően.
Az egyéb kihívások is lesz az, hogy akkor át kell adni a törvényszéki képet
, amelynek a tényleges fájlt egy digitális fényképezőgép.
És, hogy a kamera, egyszer régen, volt egy csomó fotók.
A probléma az, hogy véletlenül törölte, vagy volt a kép sérült valahogy.
Rossz dolgok történnek a digitális fényképezőgépek.
És így gyorsan másolt összes 0s és 1s le, hogy a kártya az Ön számára,
megmentette őket minden egy nagy fájlt, és aztán adja át őket, hogy Ön Problem készlet 4
így írni egy programot C-ben, amellyel vissza mindazoknak JPEG, ideális esetben.
És kiderül, hogy a JPEG, annak ellenére, hogy kissé összetett fájl formátum -
ők sokkal összetettebb, mint a mosolygó arc itt -
kiderül, hogy minden JPEG kezdődik az azonos mintáinak 0s és 1s.
Tehát a végső soron, a while vagy for ciklus vagy hasonló,
akkor ismételget az egész 0s és 1s e törvényszéki képek,
és minden alkalommal, amikor látni a különleges minta, ami meghatározott probléma set specifikáció,
akkor valószínűleg itt, nagyon nagy a valószínűsége, hogy a start a JPEG.
És amint megtalálni ugyanazt a mintát néhány byte-ok száma
vagy kilobyte vagy megabyte-ban újabb, akkor feltételezzük, itt a második JPEG,
A fénykép vettem az első után.
Engedjék meg, hagyd abba az olvasást, hogy az első fájlra, kezdjük el írni ez az új,
és a kimenet a program pset4 lesz akár 50 JPEG.
És ha ez nem 50 JPEG, van egy kis hurok.
Ha van egy végtelen számú JPEG, van egy végtelen ciklusba.
Hogy is lesz elég gyakori eset.
Szóval ez az, mi van a horizonton.
>> Kvíz 0 mögöttünk, észre egy e-mail címemet, hogy mindig vannak emberek, akik mindketten boldog,
egyfajta semleges, és szomorú körülbelül kvíz 0 idő.
És kérem, nem érhetünk el nekem, a fej TF Zamyla, saját TF,
vagy az egyik CA, hogy tudod, ha szeretné, hogy megvitassák, hogyan mentek a dolgok.
>> Tehát, hogy lenyűgözni a szülők itt a szobában, mi a CS50 könyvtár?
[Nevetés] Szép munka.
Mi a CS50 könyvtár? Igen. >> [Hallgató] Ez egy előre megírt készlet kód [hallható]
Oké, jó.
Ez egy előre megírt sor kód, amit a személyzet írta, mi az neked,
amely néhány közös funkcionalitás,
ilyesmi nekem egy string, hozz nekem egy int - összes funkcióját, hogy itt vannak felsorolva.
>> Kezdő most kezdjük igazán figyelembe e képzési kerekekkel.
Fogunk kezdeni, hogy elvegye egy string tőled,
amely visszahívás csak egy szinonimája, amit a tényleges adatok típus? >> [Több diák] Char *.
Char *. A szülők, ez volt talán [teszi whooshing hang]. Ez jó.
Char * kezdjük látni a képernyőn, annál is inkább, ahogy eltávolítani húr a mi szókincs,
legalábbis amikor ténylegesen kódot írni.
Hasonlóképpen, akkor hagyja abba a néhány ezeket a funkciókat annyi
mert a programokat fog kapni kifinomultabb.
Ahelyett, hogy csak programokat írhassanak, hogy üljön ott gyors villogó,
várja, hogy a felhasználó adja meg valamit, akkor kap alapanyagot máshol.
Például, kapsz őket egy sor bit a helyi merevlemezre.
Majd ahelyett, hogy azokat a jövőben a hálózati kapcsolat,
Néhány weboldal valahol.
>> Szóval héjúak vissza, ez a réteg az első alkalommal, és húzza ki a CS50 Appliance
és ez a nevű fájlt cs50.h, melyeket már # beleértve a héten
de most tényleg, mi van a belsejében.
A tetején a fájl a kék csak egy csomó hozzászólás:
jótállási információk és engedélyezés.
Ez egyfajta közös paradigma a szoftver
mert sok szoftver ezekben a napokban az úgynevezett nyílt forráskódú,
ami azt jelenti, hogy valaki írt a kódot, és tette szabadon hozzáférhetővé
nem csak futni és használni, hanem olvasni és változtassa meg, és integrálható a saját munkáját.
Szóval ez az, amit használ, a nyílt forráskódú szoftverek, bár nagyon kis formában.
Ha lapozzunk lefelé múltban a megjegyzéseket, bár, akkor elkezd látni néhány ismerős dolgot.
Közlemény a tetején, hogy itt a cs50.h fájl tartalmaz egy csomó header fájlokat.
A legtöbb ilyen, már nem látott, de egy ismerős.
Melyik láttunk, de röviden, eddig? >> [Hallgató] Standard könyvtár.
Ja, standard könyvtár. stdlib.h van malloc.
Amikor elkezdtünk beszélni dinamikus memória kiosztás,
amely akkor jön vissza a jövő héten is, elkezdtük beleértve a fájlt.
Kiderül, hogy bool és igaz és a hamis valójában nem léteznek C önmagában
kivéve, ha ezt a fájlt.
Mi már hetek óta, beleértve stdbool.h
úgy, hogy tudod használni a fogalmát a bool, igaz vagy hamis.
E nélkül meg kellett volna rendezni a hamis, és használni int
és csak önkényesen feltételezik, hogy a 0 és 1 hamis igaz.
Ha görgessen tovább, itt a mi meghatározása a string.
Kiderült, ahogy azt már korábban mondtam, hogy ha ez a csillag nem igazán számít.
Akkor is van hely körül.
Mi ebben a félévben már támogatása, mert ez világossá tenni
hogy a csillag köze van a típus,
de észre, hogy a közös, ha nem egy kicsit több közös,
az, hogy ott, de funkcionálisan ez ugyanaz a dolog.
De most, ha azt olvassuk le a további, vessünk egy pillantást getInt
mert használják, hogy talán, mielőtt bármi más ebben a félévben.
Itt van getInt. Ez az, amit? >> [Hallgató] A prototípus. >> Ez csak egy prototípus.
Gyakran előfordul, hogy mi tesz prototípusok a tetejét a. C kép,
de akkor is fel prototípusok header fájlokat. h kép, mint ez itt
így amikor írsz, bizonyos funkciók, hogy szeretné, hogy mások, hogy képes legyen használni,
ami pontosan a helyzet a CS50 könyvtár,
nem csak végre a feladatokat valami hasonló cs50.c,
Ön is tegye a prototípusok nem a tetején, hogy a fájl, de a tetején egy header fájlt.
Akkor header fájl, amit barátok és a kollégák között
A # include saját kódját.
Szóval ebben az időben, ha már, beleértve az összes ilyen prototípusok,
hatékonyan a tetején a fájlt, de úton a # include mechanizmust,
amely lényegében másolatok és paszták ezt a fájlt a saját.
Itt van néhány meglehetősen részletes dokumentációt.
Már nagyjából magától értetődőnek tekinti, hogy getInt kap egy int,
de kiderül, vannak sarok esetekben.
Mi van, ha a felhasználó beír egy számot, hogy ez túl nagy, a trillió,
hogy egyszerűen nem fér el egy int? Mi a várt viselkedést?
Ideális esetben ez kiszámítható.
Tehát ebben az esetben, ha valóban olvassa el az apró betűs részt,
akkor valóban látni, hogy ha a vonal nem lehet olvasni, ez visszatér INT_MAX.
Még soha nem beszéltünk erről, de alapuló kapitalizáció, mi ez talán?
[Hallgató] A konstans. >> Ez egy állandó.
Ez néhány speciális konstans, ami valószínűleg bejelentett egyik ilyen fejlécfájlokat
ez feljebb a fájlt, és INT_MAX valószínűleg valami hasonló durván 2 milliárd
az ötlet az, hogy azért, mert meg kell valahogy jelzi, hogy valami baj,
mi, igen, van 4000000000 szám áll a rendelkezésünkre: -2 milliárd legfeljebb 2 milliárd ide vagy oda.
Nos, mi a közös programozás te vagy lopni csak az egyik ezek a számok,
talán 0, talán 2 milliárd talán -2000000000,
így eltölteni egy a lehetséges értékek, így kötelezzék el magukat a világnak
hogy ha valami elromlik, vissza fogok térni a szuper nagy értéket.
De nem akarjuk, hogy a felhasználó gépelési valami rejtélyes, mint a 234 ... egy igazán nagy szám.
Te általánosítani ehelyett egy állandó.
Szóval tényleg, ha arra, hogy az anális az elmúlt hetekben, minden alkalommal, amikor hívott getInt,
akkor kellett volna, ha ellenőrzi egy feltétel volt a felhasználói típus INT_MAX,
vagy, pontosabban, volt getInt visszatérés INT_MAX, mert ha mégis,
hogy valójában azt jelenti, hogy nem írja meg. Valami nem stimmel ebben az ügyben.
Szóval ez az, ami általánosan ismert, mint egy őrszem értéket, amely csak azt jelenti, különleges.
>> Nézzük most kapcsolja be a. C fájlt.
A C fájl létezett a készülék egy ideig.
És valóban, a készülék megvan előre összeállítani téged a dolog hívtuk tárgykód,
de ez csak nem számít, hogy hol van, mert a rendszer tudja,
ebben az esetben, ha az a következő: a készülék.
Nézzük görgessen most getInt és hogyan getInt dolgozott egész idő alatt.
Itt is hasonló megjegyzéseket előtt.
Hadd nagyításához csak a kód részét.
És mi van a getInt a következő.
Ez nem veszi be.
Visszaküldi int, while (true), így van egy szándékos végtelen ciklus,
de feltehetően fogunk kitörni e valahogy, vagy térjen vissza belülről ezt.
>> Lássuk, hogyan is működik ez.
Úgy tűnik, hogy a getString ebben az első sorban a cikluson belül, 166.
Ez most jó gyakorlat, mert milyen körülmények között lehetne getString vissza
a speciális NULL kulcsszó? >> [Hallgató] Ha valami balul sül el.
Ha valami balul sül el. És mi romolhat el, ha szükséges valami ilyesmit getString?
Igen. >> [Hallgató] malloc nem, hogy ez a ints.
Igen. Talán malloc sikertelen.
Valahol a motorháztető alatt, getString hívja malloc, amely rendelkezésre bocsátja memória,
amely lehetővé teszi a számítógép tárolja az összes karakter
hogy a felhasználó beír a billentyűzetet.
És tegyük fel, a felhasználó már egy csomó szabad idő és gépelt tovább, például
mint 2 milliárd karakter, több karakter, mint a számítógép is van RAM.
GetString képesnek kell lennie arra, hogy jelzi, hogy az Ön számára.
Még ha ez egy szuper, szuper sarok gyakori eset,
azt kell valahogy, hogy képes legyen kezelni ezt,
és így getString ha mentünk vissza, és olvassuk el a dokumentációját, valóban vissza NULL.
Tehát most, ha nem sikerül getString visszaküldésével NULL, getInt fog sikertelen visszaadásával INT_MAX
csak mint egy őrszem. Ezek csak emberi egyezményeket.
Az egyetlen módja, akkor tudjuk, hogy ez az ügy, ha elolvassa a dokumentációt.
>> Nézzük lapozzunk le, ahol az int ténylegesen ütött.
Ha lapozzunk lefelé egy kicsit tovább, sorban 170, van egy megjegyzést a fenti ezeket a sorokat.
Kijelentjük, a 172 int, n, és egy char, c, és akkor ez az új funkció,
amelyek közül néhány Önök közül botlott előtt, sscanf.
Ez áll a string scanf.
Más szóval, adj egy húr, és én is kutatnak az információt érdekes.
Mit jelent ez?
Tegyük fel, hogy írja be, szó szerint, 123 a billentyűzeten, majd nyomja meg az Enter billentyűt.
Milyen adattípus a 123, ha visszaküldik getString? >> [Hallgató] String.
Ez nyilvánvalóan egy string, ugye? Van egy string.
Tehát 123 valóban, idézet-idézet vége, 123 a \ 0 a végén is.
Ez nem egy int. Ez nem egy szám. Úgy néz ki, mint egy szám, de ez valójában nem.
Szóval mit getInt kell tennem?
Azt olvasni, hogy a karakterlánc balról jobbra - 123 \ 0 - és valahogy átalakítani, hogy a tényleges értéke.
Lehet kitalálni, hogyan kell ezt csinálni.
Ha úgy gondolja, vissza pset2, akkor valószínűleg egy kicsit kényelmetlen Caesar
vagy Vigenère, így iterációkhoz egy string, akkor konvertálni karakterről ints.
De a fene, ez egy csomó munka.
Miért nem hív egy függvényt, mint sscanf azt nem, hogy az Ön számára?
Szóval sscanf vár érv - ebben az esetben az úgynevezett vonal, ami egy string.
Ezután megadhatja az idézetek, nagyon hasonlít a printf, mit vársz látni ezt a fonalat.
És mit mondok itt várom, hogy egy decimális szám, és talán egy karaktert.
És majd meglátjuk, hogy miért ez a helyzet, csak egy pillanatra.
És kiderül, hogy ez a jelölés már emlékeztet stuff elkezdtünk beszélni
alig több mint egy hete.
Mi az & n és & c tesz minket? >> [Hallgató] Cím n és címét, c.
Igen. Ez ad nekem a címét, n és címe c. Miért fontos ez?
Tudod, hogy a funkciók C, akkor mindig ad vissza értéket, vagy értékkel egyáltalán nem rendelkeznek.
Akkor vissza int, egy string, egy úszó, egy karakter, bármi, vagy visszatérhet semmis,
de csak vissza egy dolgot maximálisan.
De itt akarunk sscanf vissza hozzám talán egy int, egy decimális szám,
és egy char, és leírom, miért char egy pillanat.
Ha hatékonyan akarsz sscanf visszatérni két dolgot, de ez egyszerűen nem lehetséges, C.
Dolgozhat bárhol, hogy a tompított két cím
mert amint átadja függvény két címet,
mit tud ez a funkció csinálni velük? >> [Hallgató] írása az említett címekre.
Meg lehet írni ezeket a címeket.
Használhatja a csillag működésének és ott, hogy minden egyes ilyen címeket.
Ez a fajta a hátsó ajtó mechanizmusát, de nagyon gyakori a változó a változók értékei
több, mint egy helyen - ebben az esetben két.
Most már észre Én ellenőrizve == 1, majd visszatérnek n ha ez valójában, értékeli az igaz.
Szóval, mi folyik itt? Gyakorlatilag minden, amit igazán akar történni getInt ez.
Azt akarjuk, hogy elemezze, hogy úgy mondjam, azt akarjuk, hogy olvassa el a húr - quote-unquote 123 -
és ha úgy néz ki, van egy szám van, amit mi mondod sscanf tenni
kerül ez a szám - 123 - ebben a változó n nekem.
Szóval akkor miért Igazából ezt is?
Mi a szerepe a sscanf mondod is kap egy karaktert ide?
[Hallhatatlan diák válasza] >> A tizedes pont valóban működhet.
Nézzük meg, hogy egy pillanatra elgondolkozott. Mi van még?
[Hallgató] Lehet, NULL. >> Jó gondolat. Lehet, hogy a null karakter.
Ez valójában nem ebben az esetben. Igen. >> [Hallgató] ASCII.
ASCII. Vagy hadd általánosítani még tovább.
A% c ott is csak a hibák ellenőrzésére.
Nem akarom, hogy egy karakter szám után,
de mi ez lehetővé teszi számomra, hogy a következő.
Kiderült, hogy sscanf mellett értéket tárolhatunk az N-és C-ben ebben a példában itt,
mit is jelent ez visszaadja a változók száma terjesztett values ​​be
Tehát, ha csak írja be a 123, akkor csak a% d fog egyeztetni,
és csak n lesz tárolva egy értékkel, mint a 123,
és semmi sem lesz bevezetni c.
C marad szemét érték, hogy úgy mondjam -
szemét, mert ez soha nem inicializálni bizonyos értéket.
Tehát ebben az esetben sscanf értéke 1, mert lakott 1-e mutatók,
ebben az esetben nagy, van egy int úgyhogy szabad a vonal szabadítson fel a memória
hogy getString ténylegesen kiosztott, és aztán vissza n,
else if Gondolkozott már azon, ha ez a megállapítás Újra jön, jön itt.
Tehát, ha ezzel szemben azt írja 123foo - csak néhány véletlenszerű sorrendben szövegének -
sscanf fog látni szám, szám, szám, f,
és ez megy, hogy a 123 n, ez megy, hogy a f ac, majd vissza 2.
Tehát, csak a meghatározást sscanf viselkedését, egy nagyon egyszerű módon -
jól, komplex első pillantásra, de a végén a nap meglehetősen egyszerű mechanizmus -
a mondás van-int, és ha igen, hogy az egyetlen dolog, amit találtam?
És a szóközök itt szándékos.
Ha elolvasod a dokumentációt sscanf, azt mondja, hogy ha tartalmaznak egy darab whitespace
elején vagy a végén, sscanf is lehetővé teszi, hogy a felhasználó bármilyen okból,
a hit szóköz 123 és hogy lesz legitim.
Nem fog kiabálni a felhasználó csak azért, mert nyomja meg a szóköz
elején vagy a végén, ami csak egy kicsit felhasználóbarát.
>> Van még kérdése majd getInt? Igen. >> [Hallgató] Mi lenne, ha csak valósult meg a karakter?
Jó kérdés.
Mi van, ha csak beírt egy char, mint f, és nyomja meg az Enter anélkül, hogy valaha gépelés 123?
Mit gondol a viselkedését ezt a kódsort akkor lenne?
[Hallhatatlan hallgatói válasz]
Igen, sscanf fedezheti, hogy is, mert ebben az esetben ez nem fog kitölteni n vagy c.
Ez lesz helyette visszatér 0, ebben az esetben én is kifogása, hogy a forgatókönyv
azért, mert a várható érték akarom 1 lehet.
Én csak azt akarom egy és csak egy dolog kell kitölteni. Jó kérdés.
>> Mások? Rendben van.
>> Ne menjen végig az összes funkció itt,
de az egyik, hogy úgy tűnik, hogy talán a fennmaradó kamatot getString
mert kiderül, hogy getFloat, getInt, GetDouble, GetLongLong
minden punt sok a funkcionalitást getString.
Szóval vessünk egy pillantást, hogyan valósul meg itt.
Ez úgy néz ki, egy kicsit bonyolult, de ugyanazt a fundamentumok
hogy elkezdtünk beszélni a múlt héten.
A getString, amely nem veszi érvet, mint egy a void ide
és visszaad egy string, én vagyok nyilvánításáról látszólag egy string nevű puffer.
Én nem igazán tudom, hogy mi fog használni még, de majd meglátjuk.
Úgy néz ki, kapacitása alapértelmezés szerint 0-ra.
Nem egészen biztos, ha ez megy, és nem tudja, mit n fog használni még
de most már kezd egy kicsit érdekes.
A sorban 243, kijelentjük int, c.
Ez egyfajta hülye részletességgel.
A char 8 bites, és 8 bit tud tárolni, hogy hány különböző értéke? >> [Hallgató] 256. >> 256.
A probléma az, ha azt szeretnénk, hogy 256 különböző ASCII-karakter, ami van
ha úgy gondolja, vissza - és ez nem valami memorizálni.
De ha úgy gondolja, vissza a nagy ASCII chart volt héttel ezelőtt,
voltak ebben az esetben 128 vagy 256 ASCII karakter.
Használtuk a minták 0s és 1s fel.
Ez egy probléma, ha azt szeretné, hogy képes legyen érzékelni hiba
mert ha már használja a 256 értéket a karakterek,
Ön nem igazán előre tervezni, mert most nincs mód mondván:
ez nem egy legit karakter, ez néhány hibás üzenet.
Szóval, mi a világ nem az, hogy használja a következő legnagyobb érték, olyasmi, mint egy int,
úgy, hogy egy őrült bitek száma, 32, 4 milliárd lehetséges értékek
így egyszerűen végén felhasználásával lényegében 257 őket,
Ebből 1 olyan különleges jelentése, mint a hiba.
>> Nézzük, hogyan is működik ez.
A sorban 246, van ez a nagy while hogy hívja fgetc,
f értelmében fájlt, így getc, majd stdin.
Kiderült, hogy ez csak a pontosabb megfogalmazásban azt olvassa be a billentyűzetről.
Szabványos bemeneti eszközök billentyűzet, standard output olyan képernyőn,
és standard hiba, amit majd látni pset4, azt jelenti, a képernyő
hanem egy speciális része a képernyőn úgy, hogy ez nem keveri a tényleges kibocsátás
hogy tervezett nyomtatni. De még ezen a jövőben.
Szóval fgetc csak azt jelenti, olvasni egy karaktert a billentyűzet és tárolja, ahol?
Tárolja c.
És akkor check - úgyhogy csak használ néhány logikai kötőszavak itt -
ellenőrizze, hogy nem egyenlő - \ n, így a felhasználó Enter, szeretnénk állítani azon a ponton,
végén a hurok - és mi is szeretnénk, hogy ellenőrizze a különleges állandó EOF,
amely, ha tudod, vagy kitalálni, mit állni? >> [Hallgató] Vége a fájl. >> Vége a fájl.
Ez az a fajta értelmetlen, mert ha én vagyok gépelni a billentyűzeten,
már tényleg nincs fájlt részt ebben,
de ez csak egyfajta általános kifejezés azt jelenti,
hogy semmi más nem jön az ember ujjai.
EOF - fájl vége.
Mint félre, ha valaha is sújtotta Control D az a billentyűzet, nem az, hogy akkor még -
amit hit vezérlés C - Control D küldi ezt a különleges állandó nevű EOF.
Szóval most már csak néhány dinamikus memória kiosztás.
>> Tehát, ha (n + 1> kapacitás). Most elmondom n.
N éppen hány bájt van jelenleg a puffer,
a szöveg, hogy te éppen kiépítése a felhasználó elől.
Ha több karaktert a puffer kapacitása, mint a pufferben,
ösztönösen, mit kell tennünk ezután fordítsanak több kapacitást.
Szóval megyek sovány át néhány számtani itt összpontosítani ezt a funkciót itt.
Tudod, mi malloc van, vagy legalábbis általában ismerik.
Vegyünk egy tipp, amit realloc csinál. >> [Hallgató] Hozzáad memória.
Ez nem elég hozzá memória. Úgy reallocates memória az alábbiak szerint.
Ha van még hely a végén a húr, hogy Ön több e memória
mint azt eredetileg ad, akkor kapsz, hogy további memóriát.
Szóval lehet csak tartani üzembe a karakterlánc karakterek háttal hátra hátra.
De ha nem ez a helyzet, mert túl sokáig vártam
és valami véletlen kapott lehuppant a memóriában van
de van extra memória idelent, ez rendben van.
Realloc fog tenni a nehéz emelés az Ön számára,
mozog a húr, amit olvasott eddig innen, tedd le oda,
majd ad néhány futópálya ezen a ponton.
>> Tehát egy kézlegyintéssel, hadd mondjam el, hogy amit csinál getString
van ez kezd egy kis puffer, talán egyetlen karakter,
és ha a felhasználó beírja a két karakter, getString végül hívás realloc és azt mondja:
Egy karakter nem volt elég, adj két karakter.
Akkor, ha olvassa el a logikája a hurok, ez fog mondani
a felhasználó beírt 3 karaktert, add nekem most nem 2, hanem 4 karakter,
majd adja meg 8, akkor adj 16 és 32.
Az a tény, hogy én vagyok a kapacitás megduplázása minden alkalommal
azt jelenti, hogy a puffer nem fog lassan növekszik, ez fog növekedni szupergyors.
És mi lehet az előnye, hogy a?
Miért megduplázva a méretét a puffer
annak ellenére, hogy a felhasználó, hogy csak kell egy plusz karaktert a billentyűzet?
[Hallhatatlan diák válasza] >> Mi ez? >> [Hallgató] Nem nő azt gyakran.
Pontosan. Nem nő azt gyakran.
És ez csak egyfajta te fedezeti a fogadások itt,
az ötlet az, hogy nem akarja, hogy hívja realloc sokat, mert hajlamos arra, hogy lassú.
Minden alkalommal, amikor kérdez az operációs rendszer memória,
ahogy hamarosan látni egy jövőbeli probléma halmaz, akkor hajlamos arra, hogy időbe telik.
Így minimálisra, hogy mennyi időt, akkor is, ha pazarolja egy kis helyet,
inkább egy jó dolog.
>> De ha olvassa végig az utolsó része getString itt -
és ismét megértése minden egyes sor itt nem olyan fontos ma -
észre, hogy végül felhívja malloc újra
és osztja pontosan annyi bájt, mint szüksége a húr
majd eldobja hívja ingyenesen a túlzottan nagy puffer
ha ez valóban kapott kétszeresére túl sokszor.
Szóval röviden, ez hogyan getString dolgozott egész idő alatt.
Minden ez olvasható egy karaktert egy időben újra és újra és újra,
és minden alkalommal, amikor szüksége van némi további memóriát, akkor kéri az operációs rendszer, hogy
hívja realloc.
>> Van még kérdése? Rendben van.
>> A támadás.
Most, hogy tudjuk, mutatók, vagy legalábbis egyre inkább ismerik mutatók,
nézzük meg, hogy az egész világ kezd összeomlani
ha nem elég védekezni ellenséges felhasználók,
az emberek, akik megpróbálják feltörni a rendszert,
az emberek, akik megpróbálják ellopni a szoftver megkerülésével bizonyos regisztrációs kód
hogy máskülönben írja be
>> Nézd meg ezt a példát itt, ami csak a C kód, amelynek fő funkciója az alján
hogy felhívja a function ize. És mi van az, átadva foo?
[Hallgató] Egyetlen érv. >> [Malan] Egyetlen érv.
Szóval, argv [1], ami azt jelenti, az első szó, hogy a felhasználó beírt a parancssorban
után a.out vagy bármi a program neve.
Tehát foo tetején vesz egy char *. De char * éppen mi? >> [Hallgató] A string.
[Malan] A húr, így semmi új itt.
Ez a string önkényesen hívott bar.
Ebben a sorban van, char c [12]-ben egyfajta félig műszaki English, mi ezt a vonalat csinál?
[Hallgató] Egy sor - >> tömbje? >> [Hallgató] karakterek. >> Karakterek.
Adj egy sor 12 karakter. Tehát nevezhetnénk ezt a puffert.
Ez technikailag úgynevezett c, de a puffer programozási csak annyit jelent, egy csomó helyet
hogy lehet tenni néhány dolgot be
Aztán végül memcpy általunk nem használt korábban, de akkor talán kitalálni, hogy mit csinál.
Másolja memória. Mit tegyek?
Ez látszólag másolja bar, a bemeneti, a c de csak a hossza bar.
De van egy hiba van. >> [Hallgató] szükség van a sizeof karaktert. >> Oké.
Technikailag, meg kell tényleg strlen (bar) * sizeof (char)). Ez helyes.
De a legrosszabb esetben is, tegyük fel, hogy ez -
Oké. Aztán van két hiba.
Szóval sizeof (char));
Nézzük, hogy ez egy kicsit szélesebb.
Tehát most van még egy hiba, amely a mi? >> [Hallhatatlan tanulói válasz]
Ellenőrizze, hogy milyen? >> [Hallgató] Ellenőrizze a NULL.
Meg kell általában ellenőrzi a NULL mert rossz dolgok történnek
amikor a mutató NULL, mert lehet, hogy végül oda,
és akkor soha nem kell majd NULL dereferencing azt a csillag operátor.
Szóval ez jó. És mit csinálunk? Logikusan, van egy hiba itt is.
[Hallgató] Ellenőrizze argc a> = 2-re.
Szóval, ellenőrizze, hogy az argc> = 2. Oké, van három hiba ebben a programban van.
Mostantól ellenőrzi, ha a felhasználó ténylegesen beírt semmit argv [1]. Jó.
Szóval, mi a harmadik bug? Igen. >> [Hallgató] C lehet, hogy nem elég nagy.
Jó. Megnéztük egyik forgatókönyv.
Mi hallgatólagosan ellenőrizni nem másolja több memóriát, mint ami meghaladja a hossza bar.
Tehát, ha a húr a felhasználó beírt a 10 karakter hosszú,
ez csak annyit mondott bemásolod 10 karakter. És ez rendben van.
De mi van, ha a felhasználó beírt a szót a prompt, mint egy 20-karakteres szóval?
Ezt mondja másolat 20 karakter honnan bar abba, hogy mi?
C, más néven a puffer, ami azt jelenti, hogy csak írtam adatok
8-byte helyeken, hogy ne a saját,
és nem a tulajdonosa abban az értelemben, hogy soha nem juttatott nekik.
Szóval ez az, ami általánosan ismert, mint a buffer overflow támadás vagy puffertúlcsordulást támadás.
És ez a támadás, abban az értelemben, hogy ha a felhasználó vagy a program keresi a függvény
teszi ezt rosszindulatúan, hogy valójában mi történik ezután már valóban elég rossz lesz.
>> Szóval vessünk egy pillantást a kép itt.
Ez a kép jelent meg stack memória.
Emlékezzünk arra, hogy minden alkalommal, amikor hívni egy függvényt kap ez a kis keret a stack
, majd egy másik, majd még egy és egy másik.
És eddig, most már csak egyfajta elvonatkoztatott ezeket téglalap
sem a fedélzeten, illetve a képernyőn van.
De ha nagyítani egy olyan téglalap, ha hívja a function ize,
kiderült, hogy van még a verem belsejében, amely keret E négyszögben
, mint x, y és a és b, mint mi beszélünk csere.
Kiderül, hogy van néhány alacsonyabb szintű részletek, köztük Return Address.
Így kiderült, hogy amikor a fő felhívja foo, fő tájékoztatnia foo
milyen fő címe rajta van a számítógép memóriájában
mert különben amint foo történik végrehajtó, mint ebben az esetben itt,
ha eléri ezt a zárt kapcsos zárójel végén foo,
hogy a fene sem tudja, hol foo ellenőrzése a program állítólag menni?
Kiderül, hogy a válasz erre a kérdésre ebben a piros téglalap van.
Ez a mutató, és ez akár a számítógép átmeneti tárolására
A úgynevezett stack címét legfontosabb úgy, hogy amint foo történik végrehajtó,
a számítógép tudja, hol és milyen vonal fő, hogy menjen vissza.
Mentett Frame mutató vonatkozik hasonlóan ezt.
Char * bár itt képviseli azt, amit?
Most ez a kék szegmens itt foo a keretben. Mi az a bar?
Bár csak az az érv, hogy a foo függvény.
Tehát most vagyunk vissza valami az ismerős kép.
Van több dolgot inkább zavaró a képernyőn,
de ez a világoskék részes csak az, amit mi már építve a táblára
valami, mint a csere. Ez a keret a foo.
És az egyetlen dolog, hogy most bár, ami ezt a paramétert.
De mi mást kell lennie a verem szerint ezt a kódot itt?
[Hallgató] char c [12]. >> [Malan] char c [12].
Azt is meg kell látni 12 négyzetének lefoglalt memória változó nevű c,
és valójában mi van, hogy a képernyőn.
A legtetején van c [0] gombot, majd a szerző ezt a diagram
nem zavarta rajz az összes négyzet, de valóban 12 van
mert ha megnézzük a jobb alsó sarokban, c [11], ha számít 0-tól a 12. ilyen byte.
De itt van a probléma.
Milyen irányba c növekszik?
Valahogy felülről lefelé, ha indul a tetején, és nő az alján.
Nem úgy néz ki, mint hagytuk magunkat sok kifutópálya itt.
Már a fajta festett magunkat egy sarokba,
és c [11] is jobb ellen bárban, amely egészen ellen Elmentve Frame mutató,
amely egészen ellen Return Address. Nincs több hely.
Szóval mi a hatása, akkor ha elcseszed
és megpróbál olvasni 20 byte egy 12-bájtos puffer?
Hol vannak azok a további 8 bájt menni? >> [Hallgató] Inside -
Belül minden más, amelyek közül néhány a szuper fontos.
És a legfontosabb dolog, potenciálisan a piros doboz van, Return Address,
mert tegyük fel, hogy véletlenül vagy adversarially felülírja a 4 byte,
hogy a mutató címet, nem csak a szemetet, hanem számos
, ami történik, hogy képviselje a tényleges címet a memóriában.
Mi a hatása, logikusan? >> [Hallgató] Funkció fog visszatérni egy másik helyre.
Pontosan.
Amikor foo megtérülése és látogatottság, hogy kapcsos zárójel, a program fog eljárni
nem tér vissza a fő, hogy fog visszatérni, amit címe rajta van a piros mezőbe.
>> Abban az esetben, kijátszó szoftver regisztrációs,
mi van, ha a cím, ami visszaadta a funkció, amely rendszerint hívódik
miután kifizette a szoftver és bevisszük a regisztrációs kódot?
Akkor egyfajta trükk a számítógépet nem megy itt, hanem megy itt.
Vagy ha nagyon okos, egy támadó ténylegesen írja be a billentyűzeten, például
nem tényleges szó, nem 20 karakter, de tegyük fel, ő tényleg típusok
néhány karakter képviselő kódot.
És ez nem lesz C kód, ez valóban lesz a karakterek
képviselő bináris gépi kód, 0s és 1s.
De tegyük fel, ők elég okos ahhoz, hogy ezt megtehessük,
valahogy illessze be a getString prompt valami alapvetően lefordított kód,
és az utolsó 4 byte írja felül azt a feladó címét.
És mit jelent, hogy a bemeneti címet csinálni?
Valójában tárolja e piros téglalapban a cím első byte a puffer.
Szóval, van, hogy nagyon okos, és ez a sok tárgyalás és a hiba a rossz ember van,
de ha kitaláljuk, milyen nagy ez a puffer
oly módon, hogy az elmúlt néhány bájt a bemeneti biztosítják, hogy a program
történetesen azonos a cím a kezdetét a puffer, meg tudod csinálni ezt.
Ha azt mondjuk, hogy általában hello and \ 0, ez az, amit végül a puffert.
De ha vagyunk okosabbak, és töltse ki, hogy a puffer, amit fogunk hívni általánosan támadás kód -
AAA, támadás, támadás, támadás - ha ez csak valami, ami nem valami rossz,
mi történik, ha nagyon okos, akkor ezt.
A piros mezőben itt van egy számsor - 80, C0, 35, 08.
Figyeljük meg, hogy megfelel a száma, hogy ez itt.
Ez a fordított sorrendben, de erről bővebben majd máskor.
Vegyük észre, hogy ez a feladó címét szándékosan megváltoztatták
hogy megegyezzen a címet ide, nem a címét fő.
Tehát, ha a rossz fiú szuper okos, ő fog felvenni, hogy a támadó kódot
valami hasonló törölje az összes a felhasználó fájlokat, vagy másolja a jelszavakat
vagy készítsen egy felhasználói fiókot, hogy tudok majd be a - semmit.
>> És ez mind a veszélyt és a hatalom a C.
Mert van hozzáférése memória keresztül mutatók
és ezért levelet, amit akarsz egy számítógép memóriáját,
tudod, hogy a számítógép bármit akarsz
egyszerűen miután azt átugorja a saját memóriát.
És így a mai napig oly sok program és sok weboldalak, amelyek veszélybe
szűkülnek le, hogy az emberek kihasználják ezt.
És ez úgy tűnik, mint egy szuper kifinomult támadás, de ez nem mindig indul el így.
A valóság az, hogy mi rossz emberek általában tennie,
hogy ez a program egy parancssoros vagy GUI program, vagy egy honlap,
Ön csak elkezd nyújtó ostobaság.
Azt írja egy igazán nagy szót a keresési mezőbe, és nyomja meg az Enter,
, és várni, hogy ha a honlap összeomlik
vagy várni, hogy ha a program nyilvánul néhány hibaüzenet
mert ha szerencséd lesz, mint a rossz fiú, és hogy néhány őrült input
, hogy összeomlik a program azt jelenti, hogy a programozó nem számítottak a rossz viselkedést,
ami azt jelenti, hogy valószínűleg elég erőfeszítést, elég tárgyalás és hiba,
kitaláljuk, hogyan lehet a bérek pontosabb támadás.
Tehát annyira része a biztonság nem csak elkerüli ezeket a támadásokat összesen
de felderítésük és ténylegesen nézi most rönköt
és látta, milyen őrült bemenetek az emberek gépelt be a honlapon,
milyen keresési kifejezések embereket beírt webhelyére
abban a reményben, túláradó néhány puffer.
És ez a lényeg, hogy az egyszerű alapjait mi egy tömb
és mit jelent az, hogy kiosztani és használni memóriát.
>> Kapcsolódóan, hogy akkor is ez.
Nézzük csak pillantást belsejében egy merevlemez ismét.
Emlékszel egy vagy két hete, hogy ha húzza a fájlokat a Lomtár vagy szemetes,
mi történik? >> [Hallgató] Semmi. >> Egyáltalán semmi, ugye?
Végül, ha fut kevés lemezterület,
Windows vagy Mac OS indul A fájlok törlése az Ön számára.
De ha húzza valami ott, hogy egyáltalán nem biztonságos.
Minden szobatársam vagy barát vagy családtag köze van dupla kattintás, és íme,
ott van az összes vázlatos fájlokat próbált meg törölni.
A legtöbben, legalább tudjuk, hogy van, hogy jobb gombbal vagy a Control kattintás
és ürítse ki a szemetet, vagy valami ilyesmi.
De még így is, hogy nem egészen ezt a trükköt
mert mi történik, ha egy fájlt a merevlemezre
amely képviseli néhány Word dokumentumot vagy egy JPEG, és ez azt jelenti, a merevlemez,
és mondjuk ezt a forgács itt kijelenti, hogy fájl,
és ez áll egy csomó 0s és 1s.
Mi történik, ha nem csak húzza a fájlt a kukába lehet vagy újrahasznosítás bin
hanem üres ez? Valahogy semmi.
Ez nem semmi most.
Most már csak azért, mert nem egy kis valami történik a formában ez a táblázat.
Szóval van valami adatbázis vagy a tábla belsejében egy számítógép memóriáját
hogy lényegében egy oszlop a fájlok nevét és egy oszlop a fájlok "location,
ahol ez lehet location 123, csak egy véletlen számot.
Tehát lehet, hogy valami ilyesmi x.jpeg and location 123.
Mi történik akkor, ha valóban kiüríteni a szemetet?
Ez elmúlik.
De mi nem megy el a 0s és 1s.
>> Szóval, mi a kapcsolat a pset4?
Nos, pset4, csak azért, mert most már véletlenül törlik a Compact Flash kártya
hogy már az összes ezeket a képeket, vagy csak azért, mert a rossz szerencse sérült lett
, nem jelenti azt, hogy a 0-ák és 1-esek nincsenek még mindig ott.
Lehet, hogy néhány közülük elveszett, mert valami van elrontott
abban az értelemben, hogy egyes 0s lettek 1s és 1s váltak 0s.
Rossz dolgok történnek, mert a hibás szoftver vagy hibás hardver.
De sok ilyen bit, talán akár 100%-a még mindig ott van.
Csak, hogy a számítógép vagy a kamera nem tudja, hol JPEG1 kezdődött
és ahol JPEG2 elindult.
De ha a programozó, tudod egy kis hozzáértés, amennyiben e JPEG vannak
vagy mit néz, így elemzi a 0s és 1s és mondjuk JPEG, JPEG,
akkor írj egy programot lényegében csak egy for vagy a while ciklus
amely helyreállítja minden egyes ilyen fájlokat.
Tehát a tanulság tehát az, hogy indítsa el biztonságosan a fájlok törlése
ha szeretné, hogy elkerülje ezt teljesen. Igen.
>> [Hallgató] Hogy azt mondja a számítógépen
hogy van több memóriát, mint azelőtt?
Már több memóriát, mint azelőtt - >> [hallgató] További rendelkezésre álló memóriát.
Oh. Jó kérdés.
Akkor miért kiürítése után a szemetet nem a számítógép megmondja
hogy több szabad hely, mint azelőtt?
Dióhéjban, mert hazudik.
További technikailag, akkor nem kell több hely, mert most már azt mondta,
tudod, hogy más dolgokat, ahol azt a fájlt egyszer volt.
De ez nem azt jelenti, a biteket elmegy,
és ez nem jelenti a biteket jelenleg változik minden 0s, például,
az Ön védelme érdekében.
Így viszont, ha biztonságosan törli fájlokat vagy fizikailag semmisítse meg a készüléket,
hogy valóban ez az egyetlen módja néha körül, hogy.
>> Akkor miért nem indulunk ezen a félig ijesztő jegyzetet, és mi találkozunk hétfőn.
[Taps]
>> [CS50.TV]