[Powered by Google Translate] [Nädal 5]
[David J. Malan - Harvardi Ülikool]
[See on CS50. - CS50.TV]
>> See on CS50, 5. nädal.
Täna ja sel nädalal, tutvustame natuke maailma kohtuekspertiisi
kontekstis Ülesanded nr 4.
Täna on lühendatud loeng sest seal üritusel siin hiljem.
Nii et me võtame piiluda ja tease nii õpilased kui ka vanemad täna
mõned asjad, mis on silmapiiril.
>> Neist alates esmaspäevast, siis on veel mõned klassikaaslased.
EDX, Harvardi ja MIT-i uue online algatus OpenCourseWare ja rohkem,
on käivitades Harvardi ülikooli esmaspäeval, mis tähendab tulnud esmaspäev
siis on, kui on ometi loota, 86000 täiendavaid klassikaaslastega
kes saab pärast koos CS50 loenguid ja lõigud
ja walkthroughs ja probleem seab.
Ja osa sellest, siis muutub liikmed avaistung klassi CS50 ja nüüd CS50x.
Osana sellest nüüd aru, et seal on mõned plussid ka.
Et saada selleks valmis, sest tohutu hulk üliõpilasi,
piisab, kui öelda, et kuigi meil on 108 TF ja pädevad,
see ei ole päris parim õpilane-õpetaja suhe kui me tabanud 80000 õpilastele.
Me ei kavatse liigitamiseks nii palju probleem seab käsitsi
nii tutvustas sel nädalal probleem komplekti saab CS50 Kontrolli,
mis saab olema käsurea utiliidi jooksul seade
et sa saad kui sa uuendada seda hiljem sel nädalavahetusel.
Sul on võimalik käivitada käsku, check50, ise pset,
ja saad kohe tagasisidet selle kohta, kas teie programm on õige või vale
vastavalt erinevatele konstruktsiooni kirjeldused, et oleme andnud.
Rohkem, et probleem komplekt spetsifikatsioon.
CS50x klassikaaslastega kasutate seda samuti.
>> Ülesanded nr 4 on kõik umbes kohtuekspertiisi,
ja see pset oli tõesti inspireeritud mõned reaalse elu kraami
kusjuures kui ma olin lõpetanud keskkooli Ma interneeritud mõnda aega
koos Middlesex County District Attorney kabinetis teed kohtuekspertiisi töö
oma plii kohtuekspertiisi uurija.
Mis see oli, kui ma arvan, ma mainisin paar nädalat möödas,
mass osariigi politsei või teised oleks tulnud,
nad lahkuvad asjad nagu kõvakettad ja CDd ja disketid jms,
ja siis eesmärk kohtuekspertiisi büroo oli välja selgitada
kas oli või ei olnud tõendeid mingi.
See oli Special uurimise osakond, nii et see oli valgekraede kuritegevusega.
See oli rohkem vaeva omamoodi kuritegusid, midagi seotud mingi digitaalse meedia.
Tuleb välja, et ei ole, et paljud inimesed kirjutada talle, öeldes: "Ma tegin seda."
Nii et üsna sageli on need kohtuekspertiisi otsingud ei ilmu kõik, et palju vilja,
kuid mõnikord inimesed kirjutavad selliseid e-kirju.
Nii et mõnikord, jõupingutusi premeeriti.
>> Aga elada kuni see kohtuekspertiisi pset, saadame kehtestades pset4 natuke graafika.
Sa ilmselt võtta neid asju enesestmõistetavaks - JPEG, GIF, jms - neid päevi.
Aga kui sa tõesti arvad, pilt, palju nagu Rob nägu,
eeskujuks võiks olla jadana dots või pikslit.
Juhul Rob nägu, seal on igasuguseid värve,
ja hakkasime näha üksikuid punkte, muidu tuntud pikslit,
kui hakkasime suumimiseks
Aga kui me lihtsustada maailma natuke ja lihtsalt öelda, et see siin on Rob must-valge,
esindada must ja valge, saame lihtsalt kasutada binaarse.
Ja kui me ei kavatse kasutada binaarne, 1 või 0, saame väljendada seda sama pilt
Rob naeratav nägu see muster bitti.
11000011 tähistab valge, valge, must, must, must, must, valge, valge.
Ja nii see ei ole väga suur samm seejärel hakata rääkima värvilisi fotosid,
asjad, mida soovite näha Facebookis või võtta digikaamera.
Aga kindlasti, kui tegemist on värve, mida vaja rohkem bitte.
Ja üsna levinud maailma piltidest on kasutada mitte 1-bitine värv,
kui see ütleb, kuid 24-bitine värv, kus sa tegelikult saad miljoneid värve.
Nii nagu siis, kui me suurendada sisse Rob silma,
see oli suvaline arv miljoneid erinevaid värvikaid võimalusi.
Nii et me tutvustada seda Ülesanded nr 4, samuti ülevaadet,
mis on täna kell 03:30 asemel tavalisi 02:30 tõttu reedel loeng siin.
Aga video on Internetis nagu tavaliselt homme.
>> Me ka tutvustada teile teises failivormingus.
See on tahtlikult mõeldud vaatama hirmutavalt esimesel,
aga see on lihtsalt mingi dokumentatsioon C struct.
Selgub, et Microsoft aastat tagasi aitasid populariseerida seda formaati
nimetatakse bitmap faili formaadis, bmp, ja see oli super lihtne, värvikas graafilise faili formaadis
, mida kasutati juba mõnda aega ja mõnikord veel taustapilte lauale.
Kui te arvate tagasi Windows XP ja jooksva mäed ja sinine taevas,
mis oli tavaliselt bmp või digitaalkujutisena.
Rasterpildid on lõbus juures, sest neil on natuke rohkem keeruline.
See ei ole päris nii lihtne see ruudustik 0. ja 1s.
Selle asemel, sa pead asjad päise alguses faili.
Nii teisisõnu sees. Bmp fail on terve hunnik 0. ja 1s,
kuid seal on mõned täiendavad 0. ja 1s seal.
Ja selgub, et me oleme tõenäoliselt iseenesestmõistetavaks aastaid -
failivorminguid nagu. doc või. xls või. mp3,. mp4, olenemata failivormingud
et te olete juba tuttav - mida see üldse tähendab olla vormingus,
sest lõpus päeval kõik need failid, mida me kasutame on lihtsalt 0. ja 1s.
Ja võib-olla need 0. ja 1s esindama ABC läbi ASCII vms,
kuid lõpus päeval, see on ikka lihtsalt 0. ja 1s.
Nii et inimesed lihtsalt aeg-ajalt otsustada leiutada uus failivorming
kus nad standardida mida mustrid bitti tähendab tegelikult.
Ja selles asjas, inimesed, kes loodud bitmap faili formaat
ütles, et kõige esimene bait bitmap faili, kui tähistatakse plokist 0 seal,
seal saab olema mingi cryptically nimega muutuja nimega bfType,
mis lihtsalt seisab bitmap faili tüüp, millist tüüpi bitmap faili on selles.
Võite järeldada ehk alates teisest reast, et kompenseerida 2 baidi number 2,
on muster 0. ja 1s, mis tähistab mis? Suurust midagi.
Ja ta läheb edasi sealt.
Nii Ülesanded nr 4, siis saad kõndis läbi mõned neist asjadest.
Me ei jõua hooliv neid kõiki.
Aga märkate ta hakkab saama huvitav ümber bait 54: rgbtBlue, roheline ja punane.
Kui olete kunagi kuulnud akronüüm RGB - punane, roheline, sinine - see on viide sellele
sest selgub, võite maalida kõik värvid vikerkaar
mõned kombinatsioon punane ja sinine ja roheline.
Ja tegelikult, vanemad ruumis võiks meenutada, mõned varem projektorid.
Nendel päevadel, sa lihtsalt näha üht eredat valgust tulevad välja objektiiv,
kuid juba järgmisel päeval sul oli punane lääts, sinine objektiiv, ja roheline lääts,
ja koos nad on suunatud ekraani ja moodustasid värviline pilt.
Ja üsna tihti, keskastme koolides ja keskkoolides oleks need läätsed
kunagi nii veidi viltu, et sa olid omamoodi näeme topelt-või kolmekordne pilte.
Aga see oli mõte. Sul oli punane ja roheline ja sinine valgus maali pilt.
Ja see sama põhimõtet on kasutatud ka arvutid.
>> Nii väljakutsete hulgas siis teile Ülesanded nr 4 ei kavatse olla mõned asjad.
Üks on tegelikult muuta pildi suurust, et võtta muster 0. ja 1s,
aru saada, mis tükkideks 0. ja 1s esindama Mida struktuur niimoodi,
ja siis nuputada, kuidas imiteerida pikslit - punased, sinised, rohelised -
sees nii, et kui pilt näeb välja selline esialgu
See võib tunduda selle asemel pärast seda.
Muude probleemide liiga saab olema, et saad kätte kohtuekspertiisi pilt
tegeliku faili digikaamera.
Ja et kaamera, kunagi ammu, olid terve hunnik pilte.
Probleem on meil kogemata kustutada või oli pilt rikutud kuidagi.
Halvad asjad juhtuvad digitaalkaameratega.
Ja nii me kiiresti kopeerida kõik 0. ja 1s pealt, et kaart sulle,
salvestatakse need kõik üks suur fail, ja siis me aga neid teile Ülesanded nr 4
nii et võite kirjutada programm C keeles, mille abil taastada kõik need JPEG, ideaalis.
Ja selgub, et JPEG, kuigi nad on mõnevõrra keeruline failivorming -
nad on palju keerulisem kui see naeratav nägu siin -
Selgub, et igal JPEG algab samade mustrite 0. ja 1s.
Nii et kasutades lõpuks samas loop või loop vms,
saate kinnitada, üle kogu 0. ja 1s selles kohtuekspertiisi pilt,
ja iga kord näed eriline muster, mis on määratletud probleemi komplekt spetsifikatsioon,
võite eeldada, siin on väga suur tõenäosus, alguses JPEG.
Ja niipea kui sa leiad sama mudeli mõned baitide arv
või kilobaiti või megabaiti hiljem, siis võib eeldada, siin on teine ​​JPEG,
foto võtsin pärast esimest.
Lubage mul lõpetada lugemine, et esimese faili, hakake selle uuega,
ja toodang oma programmi pset4 saab olema koguni 50 JPEG.
Ja kui see on mitte 50 JPEG, sul on natuke silmus.
Kui teil on lõpmatu arv JPEG, teil on lõputu silmuse.
Nii et liiga on üsna sage juhtum.
Nii see on, mida on silmapiiril.
>> Viktoriin 0 möödas, realiseerida ühe minu e-posti, et alati on olemas inimesed, kes on nii õnnelik,
omamoodi neutraalne, ja kurb ümber viktoriin 0 korda.
Ja palun ärge jõuda mind, pea TF Zamyla, oma TF,
või üks CAd, et sa tead, kui sa tahaksid arutada, kuidas asjad läksid.
>> Nii muljet vanemad siin ruumis, mis on CS50 raamatukogu?
[Naer] Hea töö.
Mis CS50 raamatukogu? Jah. >> [Üliõpilane] See on eelnevalt kirjutatud rida koodi [kuuldamatu]
Olgu, hästi.
See on eelnevalt kirjutatud rida koodi, et me töötajad kirjutas, anname teile,
mis annab teatud ühine funktsionaalsus,
kraami nagu mind string, mind int - kõik funktsioonid, mis on loetletud siin.
>> Alustades nüüd, hakkame tõesti võtta need abirattad maha.
Me ei kavatse alustada ära võtta stringi sa,
mis meenutavad oli lihtsalt sünonüüm, mida tegelik andmetüüp? >> [Mitu õpilast] Char *.
Char *. Lapsevanematele, see oli arvatavasti [teeb whooshing heli]. See on hea.
Char * hakkame näha ekraanil seda enam, kui me eemaldada stringi meie sõnavara,
vähemalt kui tegemist on tegelikult kirjalikult koodi.
Samamoodi, siis lõpetame kasutades mõned neist funktsioonidest nii palju
sest meie programmid ei hakka keerulisemaks.
Selle asemel, et lihtsalt kirjutada programme, mis seal istuda koos kiire vilkumine,
ootab kasutajal tippida midagi, saad oma sisendeid mujalt.
Näiteks saad neid ka mitme bitti kohalikul kõvakettal.
Sul asemel saada neid tulevikus võrguühenduse
mõned koduleheküljel kusagil.
>> Nii et olgem koor tagasi see kiht esimest korda ja tõmba CS50 Appliance
ja see fail nimega cs50.h, mille jooksul olete # sealhulgas nädalat,
kuid olgem tegelikult näha, mis seal sees sellest.
Faili algusesse sinine on lihtsalt terve hunnik märkusi:
garantii ja litsentsimist.
See on omamoodi ühise paradigma tarkvara
sest palju tarkvara nendel päevadel on, mida nimetatakse avatud lähtekoodiga,
mis tähendab, et keegi on kirjutanud koodi ja tehtud see vabalt saadaval
mitte ainult joosta ja kasutada, kuid tegelikult lugeda ja muuta ja integreerida oma töö.
Nii see on, mida olete kasutanud, avatud lähtekoodiga tarkvara, kuigi väga väike vorm.
Kui ma keri minevikku kommentaare, aga me hakkame nägema mõned tuttavad asjad.
Teade ülaosas siin, et cs50.h fail sisaldab terve hunniku päisefaile.
Enamik neist ei ole me näinud, kuid üks on tuttav.
Milline neist oleme näinud, kuigi lühidalt, siiani? >> [Üliõpilane] Standard raamatukogu.
Jah, standard raamatukogu. stdlib.h on malloc.
Kui me hakkasime rääkima dünaamiline mälu eraldamise,
mis me tuleme tagasi järgmisel nädalal ning alustasime ka selle faili.
Selgub, et bool ja õige ja vale tegelikult ei eksisteeri C iseenesest
kui sa lisada see fail siin.
Oleme nädalaid olnud ka stdbool.h
nii, et saate kasutada mõistet bool, õige või vale.
Ilma selleta oleks teil sorteerida võltsitud ja kasutab int
ja lihtsalt suvaliselt eeldada, et 0 on vale ja 1 on tõsi.
Kui me kerige edasi, siin on meie mõiste string.
Selgub, nagu me oleme varem öelnud, et kui see täht on ei ole tegelikult küsimus.
Võite isegi ruumi kõikjalt.
Me käesoleval poolaastal on selle edendamisel see selgeks teha
et täht on pistmist tüüpi,
aga aru, kui ühine, kui mitte veidi rohkem levinud,
on panna sinna, kuid funktsionaalselt on see sama asi.
Aga nüüd, kui me loeme ette veelgi, võtame pilk GetInt
sest me kasutasime, et võib-olla esimene enne midagi muud see semester.
Siin on GetInt. See on see, mida? >> [Üliõpilane] prototüüp. >> See on lihtsalt prototüüp.
Sageli oleme pannud prototüüpide tippude meie. C faili,
kuid võite ka panna prototüüpide päisefaile. h faile, nagu see siin
nii et kui kirjutad teatud funktsioonidele, mida soovite teised inimesed, et oleks võimalik kasutada,
mis on täpselt puhul CS50 raamatukogu,
te mitte ainult ellu oma ülesandeid midagi cs50.c,
sa ka panna prototüüpe ei ülaosas et faili, kuid ülaosas header fail.
Siis, et päisefail on see, mida sõbrad ja kolleegid hulka
koos # include oma kood.
Nii et kogu see aeg, sa oled ka kõik need prototüübid,
tõhusalt ülaosas oma faili, kuid teel selle # include mehhanism,
mis sisuliselt koopiad ja pastad see fail oma.
Siin on mõned üsna üksikasjalikud dokumendid.
Me oleme päris palju enesestmõistetavaks, et GetInt saab int,
aga tuleb välja, seal on mõnes nurgas juhtudel.
Mis siis, kui kasutaja liigid number, mis on liiga suur, kvintiljon,
et lihtsalt ei mahu sees int? Milline on oodatav käitumine?
Ideaalis on see prognoositav.
Nii et sel juhul, kui te tegelikult lugeda trahvi print,
teil tegelikult näha, et kui liin ei saa lugeda, see naaseb INT_MAX.
Me pole kunagi sellest rääkinud, kuid põhineb kapitaliseerimine, mis see on ilmselt?
[Üliõpilane] konstant. >> See on pidev.
See on mingi eriline konstant, mis on ilmselt tunnistada ühes neist päisefaile
et teoksil suurem fail ja INT_MAX on ilmselt midagi umbes 2 miljardit
asja mõte on selles, et kuna me peame kuidagi tähendada, et midagi läks valesti,
me, jah, on 4000000000 numbrid meie käsutuses: -2 miljardit kuni 2 miljardit anda või võtta.
Noh, mis on levinud programmeerimine sa varastada vaid üks neid numbreid,
võibolla 0, ehk 2 miljardit ehk -2000000000,
nii et sa kulutad ühe oma võimalikest väärtustest, nii et saate pühenduda maailma
et kui midagi läheb valesti, ma tulen tagasi selle super suur väärtus.
Aga sa ei taha kasutaja kirjutades midagi segasena nagu 234 ..., tõesti suur number.
Sa üldistada seda hoopis kui konstant.
Nii et tõesti, kui sa olid anal viimastel nädalatel, iga kord, kui nimetatakse GetInt,
sa oleks pidanud kontrollides, kui tingimus ei kasutaja kirjuta INT_MAX,
või täpsemalt, tegid GetInt tagasi INT_MAX, sest kui ta seda tegi,
et tegelikult tähendab, et nad ei kirjuta seda. Midagi läks valesti antud juhul.
Nii et see on see, mis üldiselt tuntud kui sentinell väärtus, mis tähendab lihtsalt eriline.
>> Lähme nüüd saab. C faili.
C fail on olemas seadet mõnda aega.
Ja tegelikult on seadmel see eelnevalt koostatud teid, et asi nimega objekti kood,
aga see lihtsalt ei loe teile kus see on, sest süsteem teab
sel juhul, kui see on: seade.
Olgem kerige nüüd GetInt ja näha, kuidas GetInt on töötanud kogu selle aja.
Siin on meil sarnane kommentaarid enne.
Lubage mul suumida lihtsalt koodi osa.
Ja mis meil on GetInt on järgmine.
See ei võta sisend.
Ta naaseb int, while (true), nii et meil on tahtlik lõputu silmuse,
kuid arvatavasti me murda läbi selle kuidagi või naasta seest seda.
>> Vaatame, kuidas see toimib.
Me näivad kasutavat getString selles esimeses reas sees silmus, 166.
See on nüüd hea tava sest millistel tingimustel võiks getString tagasi
eriline märksõna NULL? >> [Üliõpilane] Kui midagi läheb valesti.
Kui midagi läheb valesti. Ja mis võiks valesti minna, kui helistate midagi getString?
Jah. >> [Üliõpilane] malloc ei anna see ints.
Jah. Ehk malloc ebaõnnestub.
Kuskil all kapuuts, getString helistatakse malloc, mis eraldab mälu,
mis võimaldab arvutisse salvestada kõik märgid
et kasutaja sisestada klaviatuurilt.
Ja oletame kasutaja oli palju vaba aega ja trükitud rohkem, näiteks
kui 2 miljardit märki, rohkem märke kui arvuti on isegi RAM.
GetString peab suutma tähenda, et teile.
Isegi kui see on super, super aeg-ajalt nurga puhul,
see peab kuidagi suutma hallata seda,
ja nii getString, kui me läksime tagasi ja loe selle dokumentatsiooni, tõepoolest tagasi NULL.
Nii et nüüd, kui getString ei tagastades NULL, GetInt läheb pankrotti minna tagastades INT_MAX
nagu sentinel. Need on vaid inimese konventsioonidega.
Ainus viis sa teaksid, see on nii on lugedes dokumentatsiooni.
>> Olgem kerige kus int on tegelikult saanud.
Kui ma keri natuke edasi, lähtudes 170, meil on Kommentaari eespool nimetatud liinidel.
Me kuulutame 172 int n, ja char, c, ja siis see uus funktsioon,
mis mõned teist on komistas kogu enne, sscanf.
See tähistab stringi scanf.
Teisisõnu, mulle nööri ja ma skaneerida seda tükki huvipakkuvat informatsiooni.
Mida see tähendab?
Oletame, et ma kirjutada, sõna otseses mõttes, 123 on klaviatuuri ja vajuta Enter.
Mis on andmetüüp 123 kui tagastatud getString? >> [Üliõpilane] String.
See on ilmselt string, eks? Mul on string.
Nii et 123 on tõesti, tsiteerin-Tsitaat lõppeb, 123 \ 0 lõpus ta.
See ei ole int. See pole number. Tundub arv, kuid see ei ole tegelikult.
Mis siis GetInt pead tegema?
See on skaneerida et string vasakult paremale - 123 \ 0 - ja kuidagi teisendada tegeliku täisarv.
Sa võiksid aru saada, kuidas seda teha.
Kui te arvate tagasi pset2, siis ilmselt sai natuke rahul Caesar
või Vigenere, et saaksite kinnitada, üle string, saate teisendada jutumärke ints.
Aga kurat, see on palju tööd.
Miks mitte helistada funktsioon nagu sscanf et kas see sinu jaoks?
Nii sscanf loodab argument - sel juhul nimetatakse joont, mis on string.
Seejärel tuleb määrata jutumärkides, väga sarnane printf, mida te ootate, et näha selles stringis.
Ja mida ma räägin siin on mul oodata kümnendmurruna ja võibolla iseloomu.
Ja me näeme, miks see nii on vaid hetk.
Ja selgub, et see märge on nüüd meenutab kraami hakkasime rääkima
veidi üle nädala tagasi.
Mis on & n ja & c teed meile siin? >> [Üliõpilane] aadress n ja aadress c.
Jah. See annab mulle aadressi n ja aadress c. Miks see nii tähtis on?
Sa tead, et koos funktsioonide C, saate alati naasta väärtus või puudub igasugune väärtus.
Te saate tagastada int, string, float, char, mis iganes, või võite pöörduda tühine,
kuid võite ainult tagastama ühe asja maksimaalselt.
Aga siin me tahame sscanf naasta mind äkki int, kümnendmurruna
ja ka char, ja ma seletan, miks char hetkel.
Sa tegelikult tahad sscanf tagasi kaks asja, kuid see lihtsalt ei ole võimalik C.
Võite töötada ümber, et sooritades kaks aadressid
sest niipea kui sa ulataksid funktsiooni kaks aadressi,
Mis saab selle funktsiooni nendega teha? >> [Üliõpilane] Kirjutage need aadressid.
Sellega on võimalik kirjutada neile aadressidele.
Võite kasutada täht toimimise ja sinna minna, et kõik need aadressid.
See on omamoodi see tagaukse mehhanism, kuid väga levinud muutmise väärtused muutujatele
enamat kui lihtsalt üks koht - antud juhul kaks.
Nüüd pane tähele, ma kontrollimine == 1 ja siis jälle n kui see tegelikult hinnata tõeseks.
Mis siis toimub? Tehniliselt kõik tahame juhtuda GetInt on see.
Me tahame analüüsida, nii et rääkida, me tahame lugeda string - quote-Tsitaat lõppeb 123 -
ja kui tundub, et seal on mitmeid seal, mida me ütlen sscanf teha
pannakse see arv - 123 - See muutuja n minu jaoks.
Nii et miks siis ma tegelikult ka seda?
Mis roll on sscanf öeldes võite saada ka märk siin?
[Kuuldamatu õpilase vastus] >> koma tegelikult võiks toimida.
Olgem hoidke, et mõtles hetke. Mis veel?
[Üliõpilane] See võib olla NULL. >> Hea mõte. See võib olla null iseloomu.
See on tegelikult mitte sel juhul. Jah. >> [Üliõpilane] ASCII.
ASCII. Või las ma üldistada veelgi.
% C on lihtsalt veatuvastuse.
Me ei taha seal olla märk pärast arvu,
aga mida see võimaldab mul teha on järgmine.
Selgub, et sscanf lisaks ladustamiseks väärtused n ja c selles näites siin,
Mis see ka ei ole siis tagastab arvu muutujate ta pani väärtused sisse
Nii et kui te ainult kirjutada 123, siis ainult% d saab sobitada,
ja ainult n saab ladustada, mille väärtus on nagu 123,
ja miski ei saa panna c.
C jääb prügi väärtus, kui nii võib öelda -
prügi, sest see on kunagi olnud vormindatud mõne väärtuse.
Nii et sel juhul, sscanf tagastab 1 sest ma asustatud 1, mis suunanäitajaks,
sel juhul tore, mul on int nii et ma vaba rida vabastada mälu
et getString tegelikult eraldatud, ja siis ma tagasi n
muidu kui te kunagi mõelnud, kui et Uuesti avaldus pärineb, see pärineb just siin.
Nii et kui vastupidi, ma kirjuta 123foo - lihtsalt mõne juhusliku jada teksti -
sscanf on näeme number, number, number, f,
ja see läheb üles 123 N; siis läheb panna f-c ja siis tagasi 2.
Nii et meil on, lihtsalt kasutades põhimõiste sscanf käitumist, väga lihtsal viisil -
noh, keeruline esmapilgul kuid lõpus päeval üsna lihtne mehhanism -
öelda, kas on int ja kui on, siis on see ainus asi, mis ma leidsin?
Ja tühik siin on tahtlik.
Kui sa loed dokumentatsiooni sscanf, see ütleb teile, et kui te sisaldama tükk tühik
alguses või lõpus, sscanf liiga võimaldab kasutajal ükskõik millisel põhjusel,
lüüa tühikut 123 ja mis on õigustatud.
Sa ei kisa kasutaja lihtsalt sellepärast, et nad tabanud tühiku
alguses või lõpus, mis on natuke rohkem kasutajasõbralikumaks.
>> Kõik küsimused siis GetInt? Jah. >> [Üliõpilane] Mida teha, kui sa lihtsalt panna char?
Hea küsimus.
Mis siis, kui sa lihtsalt kirjutada char nagu f ja vajuta Enter pole kunagi masinakirja 123?
Mis sa arvad käitumist rida koodi oleks siis?
[Kuuldamatu õpilase vastus]
Jah, nii sscanf võib katta et liiga, sest sel juhul ta ei kavatse täita n või c.
See läheb selle asemel tagastab 0, millisel juhul ma ka püüdmine et stsenaarium
sest eeldatav maksumus tahan on 1.
Ma tahan ainult üks ja ainult üks asi, mida tuleb täita. Hea küsimus.
>> Teised? Hea küll.
>> Ärme minna läbi kõik funktsioonid siin,
kuid üks, mis tundub olevat ehk järelejäänud huvi on getString
sest selgub, et GetFloat, GetInt, GetDouble, GetLongLong
kõik punt palju nende funktsionaalsus getString.
Võtame vaadata, kuidas ta on rakendanud siin.
See üks tundub veidi keeruline, kuid see kasutab sama põhialuste
et me hakkasime rääkima eelmisel nädalal.
Aastal getString, mis ei võta argumenti ühe tühine siin
ja see tagastab stringi, ma ilmselt olen kuulutatakse string nimega puhver.
Ma tõesti ei tea, mis see olema saab kasutada veel, aga eks näis.
Tundub võimsus on vaikimisi 0.
Mitte päris kindel, kuhu see viib, ei tea, mida n läheb kasutatakse veel,
kuid nüüd see muutub veidi põnevamaks.
Kooskõlas 243, me kuulutame int, c.
See on omamoodi loll detail.
Char on 8 bitti, ja 8 bitti saab salvestada mitu erinevat väärtust? >> [Üliõpilane] 256. >> 256.
Probleem on selles, kui sa tahad olla 256 erinevat ASCII sümboleid, mis on
kui te arvate, tagasi - ja see ei ole midagi meelde jätta.
Aga kui te arvate tagasi, et suur ASCII diagramm meil oli nädal tagasi
oli sel juhul 128 või 256 ASCII tähemärki.
Me kasutasime kõiki mudeleid 0. ja 1s üles.
See on probleem, kui soovite, et oleks võimalik leida vigu
sest kui sa oled juba kasutatakse 256 väärtused oma märki,
sa ei ole tegelikult ette planeerida, sest nüüd on kuidagi võimalik öelda,
see ei ole legit iseloomu, see on mingi vale sõnumi.
Mida maailm ei ole nad kasutavad järgmine suurem väärtus, midagi int,
nii et teil on hull bittide arv, 32, 4000000000 võimalike väärtuste
nii et saate lihtsalt lõpuks kasutavad peamiselt 257 neist,
1, mis on mingil erilisel tähendus viga.
>> Nii et vaatame, kuidas see töötab.
Kooskõlas 246, Mul on selline suur samas silmus, helistatakse fgetc,
f tähenduses faili, nii getc ja seejärel stdin.
Selgub, et see on lihtsalt täpsem viis öelda lugeda sisend klaviatuuri.
Standard sisend tähendab klaviatuur, standardväljundisse tähendab ekraani,
ja standardviga, mis me näeme pset4, tähendab ekraani
kuid eriline osa ekraanil, nii et see ei conflated koos tegeliku võimsuse
mida te soovisite printida. Aga rohkem sellest ka tulevikus.
Nii fgetc tähendab lihtsalt lugeda üks sümbolitest klaviatuur ja hoidke seda kus?
Hoidke seda c.
Ja siis vaadata - nii et ma olen lihtsalt kasutades mõned Boole'i ​​sidesõnad siin -
kontrollige, et see ei ole võrdne - \ n, nii et kasutaja ei vajuta Enter tahame peatus sel hetkel,
End of the Loop - ja me tahame ka, et kontrollida spetsiaalse pidev EOF,
mis siis, kui sa tead või arvata, mida see seisma? >> [Üliõpilane] faili lõppu. >> Faili lõppu.
See on selline mõttetu, sest kui ma olen masinakirja kell klaviatuur,
seal on tõesti mingit faili kaasatud,
aga see on lihtsalt omamoodi üldine termin, mis tähendab
et midagi muud on pärit inimese sõrmed.
EOF - faili lõppu.
Nagu kõrvale, kui sa oled kunagi tabanud kontroll D klaviatuuril, mitte et teil oleks veel -
olete tabanud kontroll C - Control D saadab selle erilise pidev nimetatakse EOF.
Nüüd me lihtsalt mõned dünaamiline mälu eraldamisel.
>> Nii et kui (n + 1> mahutavus). Nüüd ma seletan n.
N on lihtsalt mitu baiti on praegu puhver,
string, mis sa praegu ülesehitamisel kasutaja.
Kui teil on rohkem sümboleid oma puhver kui teil on võime puhver,
intuitiivselt, mida me peame tegema, siis on eraldada rohkem võimsust.
Nii et ma lähen koorima üle mõned aritmeetika siin ja keskenduda ainult see funktsioon siin.
Tead mis malloc on või on vähemalt üldiselt tuttav.
Take A Guess mida RealLOC teeb. >> [Üliõpilane] Lisab mälu.
See ei ole päris mälu lisamiseks. See reallocates mälu järgmiselt.
Kui seal on veel ruumi lõpus stringi teile rohkem, et mälu
kui see algselt annab, siis saad selle lisamälu.
Nii saate lihtsalt hoida pannes string tegelased seljad et seljad.
Aga kui see pole nii, sest sa ootasid liiga kaua
ja midagi juhuslikult sain plopped mälu seal
kuid seal on ekstra mälu siin all, pole hullu.
RealLOC kavatseb teha kõik raske töö teile,
liikuda string olete lugenud seni siit, pane see sinna alla,
ja siis annan teile mõned rohkem raja selles punktis.
>> Nii laine poolt, lubage mul öelda, et getString teeb
on see algab väikese puhvri, võibolla üks märk,
ja kui kasutaja liigid kaks märki, getString jõuab helistaja RealLOC ja ütleb
üks märk sellest ei piisa; anna mulle kaks märki.
Siis kui sa loed läbi loogika ahel, see saab öelda
kasutaja trükkida 3 tähemärki, anna mulle nüüd mitte 2 vaid 4 tähemärki,
siis anna mulle 8, siis anna mulle 16 ja 32.
Asjaolu, et ma olen kahekordistada võimsust iga kord
tähendab, et puhver ei kavatse kasvavad aeglaselt, see läheb kasvama super kiire.
Ja mis võiks olla eeliseks, et?
Miks ma kahekordistades puhver
kuigi kasutaja võib lihtsalt vaja üks pildi tegelasele klaviatuuri?
[Kuuldamatu õpilase vastus] >> Mis see on? >> [Üliõpilane] Sa ei pea kasvada nii tihti.
Täpselt. Sa ei pea kasvada nii tihti.
Ja see on lihtsalt selline oled maandamiseks oma ennustused siia,
asja mõte on selles, et sa ei taha helistada RealLOC palju, sest see kipub olema aeglane.
Iga kord, kui küsida operatsioonisüsteemi mälu,
nagu te varsti näha ka tulevikus lahendamist, see kipub aega võtta.
Nii, et vähendada seda aega, isegi kui sa raiskad ruumi,
kipub olema hea.
>> Aga kui me loeme läbi viimase osa getString siin -
ja jälle mõista iga ühele reale ei ole siin nii oluline täna -
märgata, et see lõpuks kutsub malloc uuesti
ja siis jaotab täpselt nii palju baite kui ta vajab string
ja siis viskab ära, helistades tasuta liiga suur puhver
kui ta tõepoolest ei saanud kahekordistunud liiga palju kordi.
Nii lühike, et kuidas getString on töötanud kogu selle aja.
Kõik see loeb ühe märgi korraga uuesti ja uuesti ja uuesti,
ja iga kord, kui ta vajab täiendavat mälu, siis küsib operatsioonisüsteemi see
helistades RealLOC.
>> Kas on küsimusi? Hea küll.
>> Rünnak.
Nüüd, kui me mõistame vihjeid või vähemalt on üha tuttav suunanäitajaks,
Vaatleme, kuidas kogu maailm hakkab kokku varisema
kui sa ei ole päris kaitsta vastu võistleva kasutajad,
inimesed, kes üritavad häkkida oma süsteemi,
inimesed, kes üritavad varastada oma tarkvara kõrvale mõned registreerimiskood
et nad muidu tüübi sisse
>> Heitke pilk see näiteks siin, mis on vaid C kood, mis on funktsiooni main allosas
mis nõuab funktsiooni suva. Ja mis on see möödaminnes suva?
[Üliõpilane] üks argument. >> [Malan] üks argument.
Nii argv [1], mis tähendab, et esimene sõna, et kasutaja sisestatud käsurida
pärast a.out või mis iganes programm on kutsutud.
Nii et suva ülaosas võtab sisse char *. Aga char * on just see, mida? >> [Üliõpilane] jada.
[Malan] string, mistõttu ei ole midagi uut siin.
See string omavoliliselt kutsutakse baar.
Seda joont siin, char c [12]; on omamoodi pooleldi tehniline inglise keel, mida see joon teed?
[Üliõpilane] massiivi - >> Array? >> [Üliõpilane] Lõbu. >> Lõbu.
Anna mulle massiivi 12 tähemärki. Nii et me võiksime nimetada seda puhvrit.
See on tehniliselt nimetatakse C, kuid puhver programmeerimine tähendab lihtsalt hunnik ruumi
et võite panna mõned asjad sisse
Siis lõpuks memcpy me pole varem kasutatud, kuid saate ilmselt arvata, mida ta teeb.
See kopeerib mälu. Mida see teeb?
See ilmselt kopeerib baar, oma panuse, arvesse C, kuid ainult kuni pikkus baar.
Aga seal on viga siin. >> [Üliõpilane] Sa pead sizeof iseloomu. >> Okei.
Tehniliselt me ​​peaksime tõesti strlen (baar) * sizeof (char)). See on õige.
Aga halvemal juhul siin Oletame, et see on -
Okei. Siis on kaks vead.
Nii sizeof (char));
Teeme seda veidi laiem.
Nüüd on veel bug, mis on mis? >> [Kuuldamatu õpilase vastus]
Saate mida? >> [Üliõpilane] Check for null.
Meil tuleb üldjuhul kontrollimine NULL sest halvad asjad juhtuvad
kui kursor on NULL, sest võite lõpuks läheb seal,
ning te ei tohiks kunagi läheb NULL poolt viite mahavõtmine see täht operaator.
Nii et see on hea. Ja mida muud me teeme? Loogiliselt seal on viga ka siin.
[Üliõpilane] Kontrollige, kas argc on> = 2.
Nii et kas argc on> = 2. Okei, nii et seal on kolm vead selles programmis siin.
Jälgime nüüd kontrollida, kui kasutaja tegelikult sisestatud midagi sisse argv [1]. Hea.
Mis siis kolmandal viga? Jah. >> [Üliõpilane] C ei pruugi olla piisavalt suur.
Hea. Me kontrollisime üks stsenaarium.
Me kaudselt kontrollida ei kopeeri rohkem mälu kui ületaks pikkus baar.
Nii et kui string kasutaja sisestatud on 10 tähemärki pikk,
see ütleb ainult kopeerida 10 tähemärki. Ja see on okei.
Aga kui kasutaja sisestatud sõna käsureale nagu 20-kohaline sõna?
See ütleb koopia 20 tähemärki alates baar, milliseid?
C, muidu tuntud meie puhver, mis tähendab, et sa lihtsalt kirjutasid andmed
8 baidi asukohad, mida ei oma,
ja sul ei ole neid selles mõttes, et sa kunagi eraldatud neile.
Nii et see on see, mis üldiselt tuntud kui buffer overflow rünnak või puhvri ületäitumise rünnak.
Ja see on rünnaku selles mõttes, et kui kasutaja või programm, mis helistab oma funktsiooni
teeb seda pahatahtlikult, mis tegelikult juhtub järgmisena võiks tegelikult olla üsna halb.
>> Võtame pilk see pilt siin.
See pilt kujutab oma korstnat mälu.
Tuletame meelde, et iga kord, kui helistate funktsiooni saad seda väikest raami pinu
ja siis teine ​​ja siis veel ja veel.
Ja seni on meil just selline ammutatud need nagu ristkülikud
kas laual või ekraanil siin.
Aga kui me suumida üks neist ristkülikut, kui te helistate funktsiooni suva,
selgub, et seal on rohkem korstna sees, et raami, et ristküliku
kui lihtsalt x ja y ja a ja b, nagu me ei räägi swap.
Tuleb välja, et seal on mõned madalama taseme üksikasju, nende seas saatja aadress.
Nii selgub, kui peamine nõuab suva, peamine on, et teavitada foo
Mis peamine aadress on arvuti mälu
sest teisiti, niipea kui suva tehakse täidesaatva, nagu käesolevas asjas,
kui jõuad selle suletud lokkis traksidega lõpus suva,
kuidas kuradit see foo tea, kus kontroll programmi peaks minema?
Tuleb välja, et vastus sellele küsimusele on see punane ristkülik siin.
See on kursor, ja see on kuni arvuti salvestada ajutiselt
aasta nn korstna aadress peamiselt selleks, et niipea kui suva tehakse täidesaatva,
arvuti teab kus ja mis real peamine, et minna tagasi.
Salvestatud Frame osuti puudutab sarnaselt sellele.
Char * baar siin näitab, mida?
Nüüd on see sinine segment siin on suva raami. Mis on baar?
Baar on lihtsalt väide, et suva funktsioon.
Nüüd oleme tagasi omamoodi tuttav pilt.
Seal on rohkem asju ja rohkem tähelepanu kõrvale juhitakse ekraanil
kuid see helesinine segment lihtsalt on, mida me oleme toetudes kriiditahvel
midagi nagu swap. See on raami suva.
Ja ainus asi just nüüd on baar, mis on see parameeter.
Aga mis siis veel peaks olema korstna vastavalt käesoleva seadustiku siin?
[Üliõpilane] char c [12]. >> [Malan] char c [12].
Samuti peaksime nägema 12 ruutu mälu eraldatakse muutuja nimega c,
ja tõepoolest me ei ole seda ekraanil.
Väga top on C [0], ja siis autor selle skeem
ei viitsinud joonistus kõik ruudud, kuid on ka 12 seal
sest kui te vaatate all paremal, c [11] kui loete 0 on 12. selline bait.
Aga siin on probleem.
Millises suunas on c kasvab?
Omamoodi ülevalt alla, kui see algab ülaosas ja kasvab alt.
See ei tundu nagu me lahkusime ise palju raja siin üldse.
Oleme omamoodi värvitud end nurka,
ja et c [11] on õigus kuni vastu baar, mis on õigus kuni vastu Sääst Frame pointer,
mis on õigus kuni vastu saatja aadress. Pole rohkem ruumi.
Mis siis kaudselt siis, kui sa kägardama
ja sa püüad lugemine 20 baiti arvesse 12-byte puhver?
Kuhu need 8 täiendavat baiti lähe? >> [Üliõpilane] Toas -
Toas kõik muu, millest mõned on super oluline.
Ja kõige tähtsam, potentsiaalselt on punane kast seal, saatja aadress,
sest arvan, et sa kas kogemata või adversarially kirjutatakse need 4 baiti,
et osuti aadress, mitte ainult prügi kuid mitmete
mis juhtub esindama tegelik aadress mällu.
Mis tähendas, loogiliselt? >> [Üliõpilane] Funktsiooni läheb tagasi teises kohas.
Täpselt.
Kui foo tulu ja lööke, et lokkis traksidega, programm läheb edasi
mitte naasta peamine, see läheb tagasi iganes aadress on, et punane kast.
>> Kui kõrvalehoidmise tarkvara registreerimine,
Mida teha, kui aadress, mis kuramuse tagasi on funktsioon, mis tavaliselt saab nimetada
pärast olete maksnud tarkvara ja sisestanud oma registreerimiskood?
Teil on võimalik järjestada trikk arvuti ei hakka siin, vaid tõusevad siin.
Või kui sa oled tõesti tark, vaenlane saab tegelikult kirjutada aadressil klaviatuur, näiteks
ei tegelikult sõna, mitte 20 tähemärki, kuid arvan, ta tegelikult liigid
mõned märgid, mis esindavad kood.
Ja see ei kavatse olla C-koodi, see on tegelikult saab olema tähemärki
mis esindavad binaarne masinkoodidena, 0. ja 1s.
Aga oletame, et nad on piisavalt targad, et seda teha,
kuidagi kleepida getString kiire midagi, mis on sisuliselt kompileeritud koodi,
ja viimased 4 baiti kirjutatakse, et saatja aadress.
Ja mis aadress see, et sisend teha?
See tegelikult kauplust see punane ristkülik aadress esimese baidi puhver.
Nii et sa pead olema väga tark, ja see on palju katse-eksituse eest halvad inimesed seal,
aga kui sa ei suuda välja selgitada, kui suur see puhver on
selline, et viimase paari baiti sisend pakute programmi
juhtub olema võrdne aadress algust oma puhver, seda saab teha.
Kui me ütleme, tavaliselt tere ja \ 0, vaat mis jõuab puhver.
Aga kui me veel targad ja me täidame seda puhvrit, mida me üldiselt helistada rünnaku kood -
AAA, rünnak, rünnak, rünnak - kui see on lihtsalt midagi, mis teeb midagi halba,
mis juhtub, kui sa oled tõesti tark, siis võiks seda teha.
In punane kast siin on jada numbreid - 80, C0, 35, 08.
Pange tähele, et see arvule, mis on siin üleval.
See on vastupidises järjekorras, kuid rohkem sellest mõni teine ​​kord.
Pange tähele, et see saatja aadress on teadlikult muutnud
võrduma aadress siia üles, ei aadressi peamine.
Nii et kui paha poiss on super tark, ta läheb lisada, et rünnak kood
midagi kustutada kõik kasutaja failid või kopeerida paroole
või luua kasutajakonto et saan siis sisse - midagi.
>> Ja see on nii ohtlik ja võimu C.
Kuna teil on juurdepääs mälu kaudu lähtekohtadeks
ja saate seepärast kirjutada ükskõik mida tahad arvutisse mällu
saad teha arvuti midagi teha tahad
lihtsalt võttes siis hüppavad ringi jooksul oma mälu.
Ja nii see päev nii palju programme ja nii palju veebisaidid, mis on ohus
Keeta inimesed ära see.
Ja see võib tunduda super keeruline rünnak, kuid see ei ole alati alustada niimoodi.
Reaalsus on see, et mida halvad inimesed tavaliselt ei ole,
kas see programm käsurealt või graafilise programmi või veebilehe,
sa lihtsalt alustada andes jama.
Sa kirjutad tõesti suur sõna võtta otsingu väljale ja vajuta Enter,
ja sa oodata, et näha, kui veebileht jookseb
või sa oodata, et näha, kas programm avaldub mõne veateate
sest kui sa õnnelik kui paha poiss ja pakute mõned hull sisend
et jookseb programm, mis tähendab, et programmeerija ei osatud ette näha oma halva käitumise,
mis tähendab, et saate ilmselt piisavalt vaeva, piisavalt katse-eksituse meetodil,
nuputada, kuidas palkade täpsem rünnak.
Nii et nii palju osa turvalisus ei ole ainult vältides nende rünnakute kokku
kuid avastada neid ja tegelikult vaadates logisid
ning vaadata mida hull sisendid on inimesed kirjutasid oma veebilehel,
millised otsingusõnad on inimesed kirjutasid oma veebilehel
loodab uputuse mõned puhver.
Ja see kõik taandub lihtsalt põhitõdesid, mida on massiiv
ja mida see tähendab paigutada ja kasutada mälu.
>> Seotud, et siis liiga on see.
Ütleme lihtsalt kiikama sees kõvaketas taas.
Sa mäletate nädal või kaks tagasi, et kui lohistad failid prügikasti või prügikasti,
mis juhtub? >> [Üliõpilane] Mitte midagi. >> Absoluutselt mitte midagi, eks?
Lõpuks, kui sa jooksed vähe kettaruumi,
Windows või Mac OS hakkab failide kustutamise eest.
Aga kui lohistate midagi seal, et ei ole üldse ohutu.
Kõik teie toakaaslane või sõber või pereliige peab tegema, on topeltklõps ja voila,
seal on kõik pealiskaudsed failid, mida proovisin kustutada.
Enamik meist vähemalt tean, et sa pead paremklõps või kontrolli kliki
ja tühi prügikast või midagi sellist.
Aga isegi siis, et ei ole päris trikki
sest mis juhtub, kui sul on fail kõvakettale
mis tähistab teatud Wordi dokumendi või mõne JPEG, ja see kujutab kõvakettal,
ja oletame, et see Kiip näitab siin, et faili
ja see koosneb terve hunnik 0. ja 1s.
Mis juhtub, kui sa mitte ainult lohista see fail prügikasti või prügikasti
kuid ka tühjenda see? Omamoodi midagi.
See ei ole absoluutselt midagi nüüd.
Nüüd see on lihtsalt midagi, sest natuke midagi juhtub kujul tabelis.
Nii et seal on mingi andmebaasi või tabeli sees arvuti mällu
et sisuliselt on üks veerg failide nimed ja üks veerg faili asukoha,
kus see võib olla asukoht 123, lihtsalt suvaline number.
Nii et meil oleks midagi x.jpeg ja asukoht 123.
Mis juhtub siis, kui sa tegelikult tühjendada oma prügikasti?
See läheb ära.
Aga mis ei kao on 0. ja 1s.
>> Mis siis seejärel ühendust pset4?
Noh, pset4, lihtsalt sellepärast, et me oleme kogemata kustutatud compact flash kaart
mis oli kõik need pildid või lihtsalt sellepärast, et seda halb õnn sai rikutud
ei tähenda, et 0. ja 1s ei ole veel olemas.
Võibolla mõned neist on kadunud, sest midagi sai rikutud
selles mõttes, et mõned 0s sai 1s ja 1s sai 0..
Halbu asju võib juhtuda, sest lollakas tarkvara või rikkis riistvara.
Aga paljud neist bitti, ehk isegi 100% neist on ikka veel seal.
See on lihtsalt, et arvuti või kaamera ei tea, kus JPEG1 hakkas
ja kus JPEG2 alanud.
Aga kui sa, programmeerija, tean, kellel on veidi Savvy kui need JPEG on
või millised nad välja näevad, nii et saate analüüsida 0. ja 1s ja öelda, JPEG, JPEG,
võite kirjutada programm, millel on põhimõtteliselt lihtsalt eest või samas loop
mis taastab iga üks neist faile.
Nii et õppetund siis on alustada kindlalt kustutamist failid
kui soovite, et vältida seda täielikult. Jah.
>> [Üliõpilane] Miks ta ütleb arvuti
et teil on rohkem mälu kui sa tegid enne?
Kas rohkem mälu kui sa tegid enne - >> [üliõpilane] rohkem vaba mälu.
Oh. Hea küsimus.
Nii et miks siis pärast tühjendamist prügikasti ei arvuti ütleb teile
et teil on rohkem vaba ruumi kui sa tegid enne?
Lühidalt, sest ta valetab.
Rohkem tehniliselt, sul on rohkem ruumi, sest nüüd sa ütlesid
võite panna muud kraami, kus see fail kunagi oli.
Aga see ei tähenda, bitid lähevad ära,
ja see ei tähenda, et neid tükke on muutunud kõik 0s, näiteks
teie kaitseks.
Nii seevastu kui te turvaliselt kustutab faili või füüsiliselt hävitada seadme
et tegelikult on ainus viis kord ümber selle.
>> Nii et miks me ei jäta, et pooleldi hirmutav teadmiseks, ja me näeme esmaspäeval.
[Aplaus]
>> [CS50.TV]