1 00:00:00,000 --> 00:00:02,760 [Powered by Google Translate] [SAVAITĖ 5] 2 00:00:02,760 --> 00:00:04,760 [David J. Malan, Harvardo universitetas] 3 00:00:04,760 --> 00:00:11,990 [Tai CS50.] [CS50.TV] 4 00:00:11,990 --> 00:00:17,780 [Moteris] Jis guli apie tai, kas, aš nežinau. 5 00:00:17,780 --> 00:00:20,300 [Vyras] Taigi, ką mes žinome? 6 00:00:20,300 --> 00:00:24,120 [Moteris] Tai ne 9:15, Ray Santoya buvo bankomatų. 7 00:00:24,120 --> 00:00:27,420 [Vyras] Taigi klausimas yra, ką jis daro 9:16? 8 00:00:27,420 --> 00:00:29,980 [Moteris] 9 mm Fotografavimo ne kažką. 9 00:00:29,980 --> 00:00:31,900 Galbūt jis pamatė, kad Snaiperis. 10 00:00:31,900 --> 00:00:34,000 [Vyras] Arba jis dirbo su juo. 11 00:00:34,000 --> 00:00:36,330 [Moteris] palaukti. Grįžti. 12 00:00:36,330 --> 00:00:38,330 [Vyras] Ką matote? 13 00:00:38,330 --> 00:00:44,520 [♫ suspenseful muzika ♫] 14 00:00:44,520 --> 00:00:48,320 [Moteris] Pareikšti savo veidą. Visą ekraną. 15 00:00:48,320 --> 00:00:51,230 [Man] Jo akiniai. >> Atspindys. 16 00:00:51,230 --> 00:01:00,810 [♫ suspenseful muzika ♫] 17 00:01:00,810 --> 00:01:03,580 [Vyras] Štai beisbolo komandos Nuevita. Štai jų logotipas. 18 00:01:03,580 --> 00:01:07,790 [Moteris] Ir jis kalba, kas dėvi, kad striukė. 19 00:01:07,790 --> 00:01:13,730 >> [David Malan] Taigi, tai yra CS50 savaitė 5 ir šiandien mes sugadinti jums šiek tiek televizijos ir filmų. 20 00:01:13,730 --> 00:01:16,170 Taigi, jei jūs žiūrite šou patiko šį vieną čia, 21 00:01:16,170 --> 00:01:19,910 ir policininkai sako: "Ar galite išvalyti, kad iki?" arba "Stiprinti" 22 00:01:19,910 --> 00:01:21,900 yra ne realiame pasaulyje pagerinti. 23 00:01:21,900 --> 00:01:25,220 Tiesą sakant, tai, ką jūs tikrai gausite šiek tiek kažką panašaus į tai. 24 00:01:25,220 --> 00:01:27,570 Aš iškedentas vieną iš darbuotojų nuotraukas iš puslapio. 25 00:01:27,570 --> 00:01:30,980 Tai yra programa, vadinama Photoshop. Tai yra 1 iš 2 Bowdens 26 00:01:30,980 --> 00:01:36,300 1 iš 3 Bowdens Tiesą sakant, šiandien, nes mes turime ponią Bowden čia taip pat, su Rob ir Povilo. 27 00:01:36,300 --> 00:01:41,950 Bet čia yra Rob ekrane, ir jei mes padidinti tą žibėti, jis visada turėjo savo akis, 28 00:01:41,950 --> 00:01:47,600 tai, ką jūs iš tikrųjų pamatyti, kad tai, ką matote, yra tai, ką jūs gaunate. 29 00:01:47,600 --> 00:01:51,690 Tai yra "patobulinta", todėl "CSI" yra šiek tiek negerai. 30 00:01:51,690 --> 00:01:55,190 Yra vienas kitas klipas, jei mes galime pasirinkti "CSI" tik šiek tiek ilgiau. 31 00:01:55,190 --> 00:01:58,500 Tai vienas yra gražus frazė nuo šiol ištarti, jei norite 32 00:01:58,500 --> 00:02:10,280 gerą techninį su savo draugais, kai tikrai, jūs sakote, nieko. 33 00:02:10,280 --> 00:02:12,970 >> [Vyras] savaites aš tiria Cabby Killer žmogžudysčių 34 00:02:12,970 --> 00:02:15,360 su tam tikru liguistu. 35 00:02:15,360 --> 00:02:17,160 [Moteris # 1] Tai yra realiu laiku. 36 00:02:17,160 --> 00:02:22,930 [Moteris # 2] aš sukursiu grafinė sąsaja, naudojant Visual Basic, pamatyti, jei aš galiu sekti IP adresą. 37 00:02:22,930 --> 00:02:29,570 >> [Malan] Audio out of sync atidėtos, sukurti GUI sąsają, naudojant Visual Basic 38 00:02:29,570 --> 00:02:31,820 sekti IP adresą, yra visiška nesąmonė. 39 00:02:31,820 --> 00:02:33,840 Šiomis dienomis jums nebus naudoti Visual Basic, 40 00:02:33,840 --> 00:02:38,920 nėra reikia GUI, ir IP adresas buvo techniškai tikslūs terminas. 41 00:02:38,920 --> 00:02:41,730 Todėl nuolat akis iš šių, ir vienas iš mano mėgstamiausių: 42 00:02:41,730 --> 00:02:45,070 Tai vienas šiek tiek daugiau paslaptingų, nes jūs turite žinoti, kitą kalbą. 43 00:02:45,070 --> 00:02:47,860 Yra vadinamas Objective-C kalba, kuri yra C. supersets 44 00:02:47,860 --> 00:02:51,960 , O tai reiškia, kad tai C Plus keletą papildomų funkcijų, tarp jų Objektinis programavimas. 45 00:02:51,960 --> 00:02:55,070 Ir tai yra kalba, kad "Apple" išpopuliarino iOS programavimo. 46 00:02:55,070 --> 00:02:58,760 Ir taip čia visiškai iš kito rodo klipas, iš "numeriai 47 00:02:58,760 --> 00:03:02,450 , kad, jei jūs iš tikrųjų atidžiai jūsų programinės įrangos TiVo ir pauzė reikiamu metu, 48 00:03:02,450 --> 00:03:07,700 pamatysite, kad tai, ką jie žiūri į tai ne visai tai yra aprašyta. 49 00:03:07,700 --> 00:03:11,170 Ir leiskite man pabandyti kitą garso jungtis čia ir pamatyti, jei mes negalime 50 00:03:11,170 --> 00:03:13,780 išlaikyti šį kartą sinchronizuoti garso. 51 00:03:13,780 --> 00:03:20,530 Aš duosiu jums "numerius." 52 00:03:20,530 --> 00:03:23,240 >> [Man # 1] 32-bitų IPv4 adresas. 53 00:03:23,240 --> 00:03:38,930 [Man # 2] IP, tai interneto. >> Privatų tinklą. Tai Anita privatus tinklas. 54 00:03:38,930 --> 00:03:43,810 [Malan] Gerai. Tai Objective-C, ir tai kai vaikas spalvinimo programą, 55 00:03:43,810 --> 00:03:51,140 , kaip jūs galite galbūt numanyti iš kintamojo ten pavadinimas. 56 00:03:51,140 --> 00:03:54,410 Taip, kad tada buvo "numeris." Taigi, šiandien ir šią savaitę mes pristatome 57 00:03:54,410 --> 00:03:57,740 šiek tiek ekspertizės ir problemų, todėl pasaulyje. 58 00:03:57,740 --> 00:04:00,590 Šiandien bus sutrumpintas paskaita, nes ten yra ypatingas įvykis čia 59 00:04:00,590 --> 00:04:05,530 po to, kad mes priimsime žvilgtelėti ir erzinti ir mokiniai bei jų tvai panašūs šiandien 60 00:04:05,530 --> 00:04:07,420 kai kurių dalykų, kurie, dėl horizonto. 61 00:04:07,420 --> 00:04:12,240 Tarp jų, kaip nuo pirmadienio, jūs turite keletą klasiokų. 62 00:04:12,240 --> 00:04:16,050 EDX, Harvardo ir MIT nauja internetinė iniciatyva atviro kursų 63 00:04:16,050 --> 00:04:19,120 ir daugiau, pradeda Harvardo universiteto miesteliu pirmadienį. 64 00:04:19,120 --> 00:04:21,490 , O tai reiškia, atėjo pirmadienis, turėsite nuo paskutinio skaičiaus, 65 00:04:21,490 --> 00:04:26,210 86.000 papildomų klasiokai bus kartu su CS50 paskaitų 66 00:04:26,210 --> 00:04:29,170 ir specialieji profiliai ir Walkthroughs ir problemų rinkiniai. 67 00:04:29,170 --> 00:04:32,350 Ir pagal šią programą, jūs tapsite nariai steigiamajame klasės 68 00:04:32,350 --> 00:04:35,090 CS50 ir dabar CS50x. 69 00:04:35,090 --> 00:04:39,310 >> Pagal šią programą, dabar suprantame, kad ten bus kai upsides taip pat. 70 00:04:39,310 --> 00:04:43,790 Pasiruošti už tai, dėl didelio studentų skaičiaus, 71 00:04:43,790 --> 00:04:47,180 pakanka pasakyti, kad nors mes turime 108 TFS ir CAS, 72 00:04:47,180 --> 00:04:50,790 ne visai geriausias studentas / mokytojų santykis, kai mes Hit 80.000 kitus studentus. 73 00:04:50,790 --> 00:04:52,850 Taigi mes neketiname būti klasifikavimo tiek daug problema nustato rankiniu būdu. 74 00:04:52,850 --> 00:04:55,920 Taigi pristatė šią savaitę problemą, bus CS50 Registracijos 75 00:04:55,920 --> 00:04:58,450 , kuris bus per prietaiso komandų eilutės įrankis 76 00:04:58,450 --> 00:05:01,200 kad jūs gaunate, kai jūs ją atnaujinti vėliau Šį savaitgalį, 77 00:05:01,200 --> 00:05:03,200 ir galėsite paleisti komandą, patikrinkite, ar 50, 78 00:05:03,200 --> 00:05:06,500 savo pset ir jūs gausite sulaukti atsiliepimų, ar programa yra 79 00:05:06,500 --> 00:05:11,160 teisingas, ar neteisingas pagal įvairaus dizaino specifikacijas, kurias mes teikiame. 80 00:05:11,160 --> 00:05:13,580 Taigi, daugiau apie tai ir problemą, specifikacijos ir 81 00:05:13,580 --> 00:05:17,240 bus naudojamas CS50x klasiokai tai taip pat. 82 00:05:17,240 --> 00:05:19,230 >> Taigi problema rinkinys 4 yra visa informacija apie ekspertizės. 83 00:05:19,230 --> 00:05:21,940 Ir šis gabalas buvo įkvėptas kai kurių realaus gyvenimo dalykų, 84 00:05:21,940 --> 00:05:24,620 , pagal kurią, kai man buvo aukštosios mokyklos, aš internuoti tam tikrą laiką 85 00:05:24,620 --> 00:05:28,650 Middlesex County apygardos prokuratūra daro ekspertizės darbą 86 00:05:28,650 --> 00:05:31,650 su jų švino kriminalistikos tyrėjas, ir ką tai sudarė 87 00:05:31,650 --> 00:05:35,260 , manau, kad minėta kelios savaitės praeitį, yra masė valstybinės policijos ar kiti 88 00:05:35,260 --> 00:05:39,000 ateis, jie užsnūsti dalykų, pavyzdžiui, standžiųjų diskų ir kompaktinių diskų ir diskelių 89 00:05:39,000 --> 00:05:42,340 ir kaip, o tada ekspertizės biure tikslas buvo išsiaiškinti, ar 90 00:05:42,340 --> 00:05:44,600 ten buvo ar nebuvo įrodymų, kad tam tikros rūšies. 91 00:05:44,600 --> 00:05:48,010 Tai buvo Specialiųjų tyrimų skyrius, todėl buvo baltos apykaklės nusikalstamumu, 92 00:05:48,010 --> 00:05:52,350 buvo daugiau rūpesčių rūšiuoti nusikaltimų, 93 00:05:52,350 --> 00:05:55,990 nieko įtraukiant kažkokį skaitmeninės žiniasklaidos, paaiškėja, kad ne, kad daugelis žmonių, 94 00:05:55,990 --> 00:05:59,370 parašyti laišką, sakydamas: "Aš tai padariau". 95 00:05:59,370 --> 00:06:03,290 Taigi gana dažnai šie Teismai ieško ne riesti visi, kad daug vaisių, 96 00:06:03,290 --> 00:06:05,850 bet kartais žmonės rašyti tokius pranešimus. 97 00:06:05,850 --> 00:06:08,490 Todėl kartais pastangos buvo apdovanoti. 98 00:06:08,490 --> 00:06:14,420 >> Bet vadovauti šio teismo ekspertizės pset, mes nustatyti 4 pset bitų grafika. 99 00:06:14,420 --> 00:06:18,260 Taigi, jūs tikriausiai imtis šių dalykų savaime suprantamu dalyku, JPEG, GIF ir kaip šių dienų, 100 00:06:18,260 --> 00:06:21,640 bet jei jūs manote apie tai, vaizdas, panašiai kaip Rob veidą, 101 00:06:21,640 --> 00:06:24,430 gali būti modeliuojama kaip taškų seka, arba pikseliai. 102 00:06:24,430 --> 00:06:26,680 Dabar, Rob veidą, yra įvairiausių spalvų, 103 00:06:26,680 --> 00:06:29,940 ir mes pradėjome matyti atskirus taškus, otherwide žinomas kaip pikselių, 104 00:06:29,940 --> 00:06:31,610 Kai mes pradėjome, norėdami ją padidinti. 105 00:06:31,610 --> 00:06:35,590 Bet jei mes supaprastinti pasaulį šiek tiek, ir tiesiog pasakyti, kad tai čia is Rob 106 00:06:35,590 --> 00:06:40,560 juoda ir balta, gerai, atstovauti juoda ir balta, mes galime tik naudoti dvejetainis. 107 00:06:40,560 --> 00:06:44,960 Ir jei mes ketiname naudoti dvejetainis, 1 arba 0, mes galime išreikšti tą patį vaizdą 108 00:06:44,960 --> 00:06:51,970 Rob besišypsantį veidą su šiuo bitų modelis: 11000011 atstovauja 109 00:06:51,970 --> 00:06:55,160 balta, balta, juoda, juoda, juoda, juoda, balta balta. 110 00:06:55,160 --> 00:06:59,290 Ir todėl didžiulis šuolis, tada pradėti kalbėti apie spalvinga fotografijų. 111 00:06:59,290 --> 00:07:01,920 Dalykų, kad galėtumėte pamatyti "Facebook" arba pasiimti su skaitmeninio fotoaparato, 112 00:07:01,920 --> 00:07:04,730 bet, žinoma, kai jis ateina į spalvų, jums reikia daugiau bitų. 113 00:07:04,730 --> 00:07:08,470 Ir gana paplitusi fotografijų pasaulyje yra naudoti ne 1-bitų spalvos, 114 00:07:08,470 --> 00:07:12,730 , nes tai rodo, bet 24-bitų spalvos, kur jūs iš tikrųjų gauti milijonus spalvų. 115 00:07:12,730 --> 00:07:15,430 Taigi, tuo atveju, kai mes Mastelis Rob akis, 116 00:07:15,430 --> 00:07:19,270 , kuris buvo bet milijonų skirtingų spalvinga galimybių. 117 00:07:19,270 --> 00:07:22,260 >> Taigi, mes jums pristatyti šią problemą, 4, taip pat į rankos 118 00:07:22,260 --> 00:07:27,050 kuri bus šiandien 03:30 vietoj įprastos 2:30 dėl penktadienio paskaitos čia. 119 00:07:27,050 --> 00:07:29,930 Bet video bus internete, kaip įprasta, rytoj. 120 00:07:29,930 --> 00:07:31,880 Mes taip pat supažindinti jus į kitą failo formatą. 121 00:07:31,880 --> 00:07:34,150 Todėl tai sąmoningai siekiama atrodyti bauginanti iš pirmo, 122 00:07:34,150 --> 00:07:38,980 bet tai tik kai C struct dokumentacija. 123 00:07:38,980 --> 00:07:42,280 Pasirodo, kad "Microsoft", prieš keletą metų, padėjo populiarinti šį formatą, 124 00:07:42,280 --> 00:07:46,630 vadinamas bitmap failo formatas, BMP, ir tai buvo super paprasta, 125 00:07:46,630 --> 00:07:50,390 spalvinga grafinis failo formatas, kuris buvo naudojamas gana ilgą laiką 126 00:07:50,390 --> 00:07:53,640 , o kartais ir dar tapetai ant darbo stalų. 127 00:07:53,640 --> 00:07:57,410 Jei manote, kad atgal į "Windows XP" ir kalvomis ir mėlynu dangumi, 128 00:07:57,410 --> 00:08:00,660 kad paprastai BMP, ar rastrinis vaizdas, ir rastrai 129 00:08:00,660 --> 00:08:03,340 yra įdomus mums, nes jie turi šiek tiek daugiau sudėtingumą. 130 00:08:03,340 --> 00:08:05,640 Tai ne visai taip paprasta, kaip šis tinklelis 0 ir 1; 131 00:08:05,640 --> 00:08:10,680 Vietoj to, turite dalykų, pavyzdžiui, ne antraštės failo pradžioje. 132 00:08:10,680 --> 00:08:15,520 Taigi, kitaip tariant, viduje bmp failą yra visa krūva 0 ir 1, 133 00:08:15,520 --> 00:08:18,070 bet yra šiek tiek papildomos 0 ir 1 ten. 134 00:08:18,070 --> 00:08:21,450 Ir paaiškėja, kad tai, ką mes tikriausiai savaime suprantamu dalyku už metus, 135 00:08:21,450 --> 00:08:27,040 failų formatus, pavyzdžiui, doc arba. xls arba. mp3. Mp4, 136 00:08:27,040 --> 00:08:29,910 kokia failų formatus, kad esate susipažinę su. 137 00:08:29,910 --> 00:08:31,900 Na, ką jis dar reiškia būti failo formatas? 138 00:08:31,900 --> 00:08:35,740 , Nes bent dienos pabaigoje, visi iš šių failų, mes naudojame tik 0 ir 1 139 00:08:35,740 --> 00:08:39,950 , o gal tie 0 ir 1 atstovauti a, b, c, per ASCII arba iš panašių dirbinių, 140 00:08:39,950 --> 00:08:42,030 tačiau per dienos pabaigoje, tai tik 0 ir 1. 141 00:08:42,030 --> 00:08:45,300 >> Todėl žmonės tiesiog kartais nusprendžia sukurti naują failo formatą 142 00:08:45,300 --> 00:08:49,420 kur jie standartizuoti bitų modeliai bus iš tikrųjų reiškia. 143 00:08:49,420 --> 00:08:52,790 Ir šiuo atveju čia, žmonės, kurie sukūrė bitmap failo formatą 144 00:08:52,790 --> 00:08:58,260 rastrinio formato failą labai iš pirmo baito sakė, kad, kaip žymimas kompensuoti 0, ten, 145 00:08:58,260 --> 00:09:02,320 ten bus kai cryptically pavadintas kintamasis vadinamas bfType 146 00:09:02,320 --> 00:09:06,510 , kuris tiesiog reiškia bitmap failo tipą, kokio tipo rastrinio formato failą tai. 147 00:09:06,510 --> 00:09:10,780 Galite daryti išvadą, ko gero, iš antrosios eilės, kad kompensuoti 2, 2 baitų skaičius, 148 00:09:10,780 --> 00:09:15,980 0 ir 1, kad yra kas modelis? 149 00:09:15,980 --> 00:09:18,320 Kažką dydis, ir jis eina iš ten. 150 00:09:18,320 --> 00:09:20,660 4 problemą, jums bus vaikščioti per kai kurias iš šių dalykų. 151 00:09:20,660 --> 00:09:24,480 >> Nebus baigti rūpintis apie juos visus, bet pastebėsite, kad jis pradeda gauti įdomu 152 00:09:24,480 --> 00:09:30,780 aplink linijos arba 54 BYTE, rgbtBlue, žalia ir raudona. 153 00:09:30,780 --> 00:09:35,280 Jeigu jūs kada nors girdėję akronimą RGB, raudona žalia mėlyna, tai yra nuoroda į tai. 154 00:09:35,280 --> 00:09:37,840 Nes paaiškėja, jūs galite dažyti visas vaivorykštės spalvas 155 00:09:37,840 --> 00:09:41,580 su šiek tiek raudonos ir mėlynos ir žalios spalvos derinys. 156 00:09:41,580 --> 00:09:46,560 Ir, tiesą sakant, į kambarį tėvai gali priminti kai iš pirmųjų projektorių. 157 00:09:46,560 --> 00:09:49,360 Šių dienų, jūs tiesiog pamatyti 1 ryškios šviesos išeina iš lęšio. 158 00:09:49,360 --> 00:09:52,870 Bet atgal per dieną, jums turėjo raudoną objektyvas, mėlyną objektyvas, ir Green lens 159 00:09:52,870 --> 00:09:56,620 ir jie kartu siekiama ekrane ir sudarė spalvingą vaizdą. 160 00:09:56,620 --> 00:09:59,590 Ir gana dažnai vidurinės mokyklos ir aukštųjų mokyklų turės tuos lęšius 161 00:09:59,590 --> 00:10:02,680 vis taip šiek tiek Marley, todėl jūs tarsi matyti dviejų ir trijų vaizdų, 162 00:10:02,680 --> 00:10:07,500 bet tai buvo idėja. Jūs turėjote raudona ir žalia ir mėlyna šviesa, tapyba nuotrauką. 163 00:10:07,500 --> 00:10:09,570 Ir tas pats principas naudojamas kompiuteriuose. 164 00:10:09,570 --> 00:10:12,000 >> Taigi tarp iššūkių, tada jums nustatyti problemos 4 165 00:10:12,000 --> 00:10:16,080 bus keletas dalykų, vienas, kad iš tikrųjų dydį vaizdą. 166 00:10:16,080 --> 00:10:18,050 Siekiant atsižvelgti į 0 ir 1 modelis, 167 00:10:18,050 --> 00:10:22,840 išsiaiškinti, kuris gabaliukus 0 ir 1 - kas statinio, kaip tai, 168 00:10:22,840 --> 00:10:26,800 ir tada išsiaiškinti, kaip atkartoti vaizdo taškai: REDs, bliuzo, Žalieji 169 00:10:26,800 --> 00:10:32,460 viduje taip, kad, kai vaizdas atrodo taip iš pradžių, gali atrodyti taip, o ne po to. 170 00:10:32,460 --> 00:10:35,590 Tarp kitų iššūkių, taip pat bus, kad jums bus įteiktas 171 00:10:35,590 --> 00:10:38,900 faktinės bylos teismo vaizdas iš skaitmeninio fotoaparato 172 00:10:38,900 --> 00:10:42,410 ir kad kamera once upon a time, buvo visa krūva nuotraukų. 173 00:10:42,410 --> 00:10:47,030 Problema ta, kad mes netyčia ištrinti arba buvo sugadinta kažkaip vaizdas. 174 00:10:47,030 --> 00:10:51,040 Blogi dalykai nutinka su skaitmeninėmis kameromis, tad greitai nukopijuoti visus 0 ir 1 175 00:10:51,040 --> 00:10:55,410 išjungti, kad už jus kortelę, išsaugoti juos visus 1 didelį failą, ir tada mes perduoti juos jums 176 00:10:55,410 --> 00:11:00,000 problema (4) nustatyti, kad galite rašyti C programą, su kuria susigrąžinti 177 00:11:00,000 --> 00:11:02,660 tų JPEG idealiai. 178 00:11:02,660 --> 00:11:06,280 Ir paaiškėja, kad JPEG, nors jie šiek tiek sudėtingos failo formatu, 179 00:11:06,280 --> 00:11:09,580 jie yra daug sudėtingesnis nei šis besišypsantį veidą. 180 00:11:09,580 --> 00:11:14,320 It turns out, kad kiekvienas JPEG prasideda nuo tų pačių modelių 0 ir 1. 181 00:11:14,320 --> 00:11:18,820 Taigi, naudojant while cikle arba linijos ar panašios, 182 00:11:18,820 --> 00:11:22,350 galite pakartoti per visus 0 ir 1 šiame teismo ekspertizės vaizdo 183 00:11:22,350 --> 00:11:26,670 ir kiekvieną kartą, kai pamatysite specialų modelį, kuris apibrėžtas problemą, specifikacijas, 184 00:11:26,670 --> 00:11:29,770 galite manyti, "O, čia yra su labai didele tikimybe, 185 00:11:29,770 --> 00:11:33,520 JPEG pradžia ", o kuo greičiau Jums susirasti tas pats modelis, 186 00:11:33,520 --> 00:11:36,050 vėliau kai baitų ar kilobaitų ir megabaitų skaičius, 187 00:11:36,050 --> 00:11:40,550 galite manyti, "Ooh! Čia yra antroji JPEG nuotrauka, aš paėmė po pirmosios. 188 00:11:40,550 --> 00:11:44,720 Leiskite man nustoti skaityti, kad pirmą failą, pradėkite rašyti šį naują. " 189 00:11:44,720 --> 00:11:49,980 Ir iš savo programos 4 pset produkcija bus ne daugiau kaip 50 JPEG. 190 00:11:49,980 --> 00:11:52,400 Ir jei tai ne 50 JPEG, turite šiek tiek kilpa. 191 00:11:52,400 --> 00:11:55,580 Jei turite begalinį skaičių JPEG, turite begalinis ciklas. 192 00:11:55,580 --> 00:11:58,280 , Taip pat, kad bus gana dažnas atvejis. 193 00:11:58,280 --> 00:12:00,280 Štai ką dėl horizonto. 194 00:12:00,280 --> 00:12:03,740 >> Viktorina 0, už mus. Suprantu, per mano elektroninio pašto adresą, kad visada yra žmonės 195 00:12:03,740 --> 00:12:06,820 kurie abu laimingi, tarsi neutralus, ir liūdna, aplink viktorina 0 laikas. 196 00:12:06,820 --> 00:12:10,160 Ir prašome pasiekti, kad mane, galvos TFS, Zamyla, savo TF 197 00:12:10,160 --> 00:12:14,120 CAS arba, kad jūs žinote, jei norite aptarti, kaip viskas vyko. 198 00:12:14,120 --> 00:12:16,460 >> Taigi, norint įtikinti, kad tėvai į kambarį, 199 00:12:16,460 --> 00:12:23,990 kas yra CS50 biblioteka? Geras darbas. 200 00:12:23,990 --> 00:12:32,280 Kas yra CS50 biblioteka? Taip? [Studentų atsakymai, neįskaitomai] 201 00:12:32,280 --> 00:12:35,730 >> Gerai, gerai. Todėl prewritten rinkinys kodo, kad mes, darbuotojai, rašė, 202 00:12:35,730 --> 00:12:38,460 mes pateikiame jums pateikti keletą bendrų funkcijų. 203 00:12:38,460 --> 00:12:42,290 Daiktai, kaip man eilutę; man int, visų funkcijų, kurios yra išvardyti čia. 204 00:12:42,290 --> 00:12:45,260 Nuo dabar, mes pradedame iš tiesų imtis šias mokymo ratus. 205 00:12:45,260 --> 00:12:48,230 Taigi, mes ketiname pradėti atimti iš jūsų "string", 206 00:12:48,230 --> 00:12:52,790 kuris, išėmimą iš apyvartos, buvo tik sinonimas, ką faktinis duomenų tipas? char *. 207 00:12:52,790 --> 00:12:57,020 Taigi tėvams, kad tikriausiai buvo - kad gerai, kad char * mes pradėti rodyti 208 00:12:57,020 --> 00:13:00,810 ekrane daugiau, kaip mes pašalinti "STRING" iš mūsų žodyno, 209 00:13:00,810 --> 00:13:02,760 bent jau kai kalbama, kad iš tikrųjų rašyti kodą. 210 00:13:02,760 --> 00:13:06,240 Be to, mes sustabdysime naudojant kai kurias iš šių funkcijų, kiek, 211 00:13:06,240 --> 00:13:08,390 , nes mūsų programos gauti daugiau sudėtingas 212 00:13:08,390 --> 00:13:11,370 , o ne tik rašyti programas, kad sėdi ten su greitai mirksi, 213 00:13:11,370 --> 00:13:13,580 laukia, kad vartotojas galėtų tipo kažkas in 214 00:13:13,580 --> 00:13:15,220 Jūs gausite savo sąnaudas iš kitur. 215 00:13:15,220 --> 00:13:18,720 Pavyzdžiui, jūs gausite juos iš bitų serijos dėl vietos standžiajame diske. 216 00:13:18,720 --> 00:13:23,340 Jūs, o ne gauti juos ateityje iš tinklo ryšį, kai svetainė kažkur. 217 00:13:23,340 --> 00:13:27,460 Todėl galime žievelės atgal Šis pirmą kartą sluoksniu ir atsigriebti CS50 prietaisą 218 00:13:27,460 --> 00:13:32,300 ir šį failą, vadinamas CS50.h, jūs buvote aštrus savaites. 219 00:13:32,300 --> 00:13:34,380 >> Bet galime iš tikrųjų pamatyti, kas yra viduje. 220 00:13:34,380 --> 00:13:38,250 Taigi mėlynai failo viršuje yra tik visa krūva pastabų, 221 00:13:38,250 --> 00:13:41,340 Informacija apie garantiją ir licencijavimas. Tai yra tarsi bendros paradigmos 222 00:13:41,340 --> 00:13:44,600 programinės įrangos, nes programinės įrangos daug šių dienų yra tai, kas vadinama "atviro šaltinio" 223 00:13:44,600 --> 00:13:46,940 , o tai reiškia, kad kažkas parašyta kodą 224 00:13:46,940 --> 00:13:50,060 ir padarė ją laisvai prieinama, o ne tik paleisti ir naudoti, 225 00:13:50,060 --> 00:13:53,660 bet iš tikrųjų skaityti ir pakeisti ir integruoti į savo darbą. 226 00:13:53,660 --> 00:13:55,790 Taip, kad tai, ką jūs naudojate, atviro kodo programinę įrangą, 227 00:13:55,790 --> 00:13:58,030 , nors ir labai maža. 228 00:13:58,030 --> 00:14:01,860 Jei aš slinkti žemyn praeityje komentarų, nors mes pradėsime pamatyti kai kuriuos žinomus dalykus. 229 00:14:01,860 --> 00:14:08,090 Taigi pastebėti čia viršuje, kad CS50.h faile yra visa krūva header files. 230 00:14:08,090 --> 00:14:11,160 Dabar, dauguma jų mes dar nematėte anksčiau, bet vienas yra 231 00:14:11,160 --> 00:14:15,640 pažįstamas, kuris iš jų mes matėme, nors ir trumpai, iki šiol? 232 00:14:15,640 --> 00:14:18,720 Taip, standartinės bibliotekos. Stdlib.h malloc, 233 00:14:18,720 --> 00:14:21,590 taigi, kai mes pradėjome kalbėti apie dinaminio atminties paskirstymo, 234 00:14:21,590 --> 00:14:24,960 kuriuos mes grįžti kitą savaitę, taip pat, mes pradėjome įskaitant šio failo. 235 00:14:24,960 --> 00:14:29,660 It turns out, kad bool, true ir false nėra iš tikrųjų egzistuoja C, per se, 236 00:14:29,660 --> 00:14:32,460 , jei norite įtraukti šį failą čia. 237 00:14:32,460 --> 00:14:35,770 Taigi, mes, savaites, buvo įskaitant standartinę bool.h 238 00:14:35,770 --> 00:14:39,020 taip, kad jūs galite naudoti bool, true arba false. sąvoką 239 00:14:39,020 --> 00:14:41,830 Be to, jums reikės rūšiuoti Fake It ir naudoti int 240 00:14:41,830 --> 00:14:45,920 ir tiesiog savavališkai manyti, kad 0 yra klaidingas ir 1 yra tiesa. 241 00:14:45,920 --> 00:14:49,980 >> Dabar, jei mes slinkti žemyn toliau, čia yra mūsų apibrėžimas eilutę. 242 00:14:49,980 --> 00:14:54,820 It turns out, kaip mes jau sakiau anksčiau, kad kur tai * yra tikrai ne klausimas. 243 00:14:54,820 --> 00:14:56,750 Jūs netgi galite turėti erdvę, visi aplink. 244 00:14:56,750 --> 00:15:01,550 Mes, šį semestrą, buvo skatinti, nes tai aiškiai pasakyti, kad * turi daryti su tipo. 245 00:15:01,550 --> 00:15:05,370 Bet suprasti, kaip bendra, jei ne šiek tiek labiau paplitęs, yra jį ten 246 00:15:05,370 --> 00:15:07,480 bet funkciniu požiūriu tai tas pats dalykas. 247 00:15:07,480 --> 00:15:11,070 O dabar, jei mes skaitome toliau, tegul Pasakykite, atrodo, GetInt, 248 00:15:11,070 --> 00:15:15,350 , nes mes naudojamas, kad ko gero, prieš ką nors šį semestrą. 249 00:15:15,350 --> 00:15:19,620 Ir čia yra GetInt. Tai, ką? 250 00:15:19,620 --> 00:15:24,650 Tai yra prototipas. Taip dažnai, mes turime įdėti prototipų ne mūsų viršūnes c failai, 251 00:15:24,650 --> 00:15:28,190 bet taip pat galite įdėti prototipus Header files, h failus, 252 00:15:28,190 --> 00:15:32,110 patiko šį vieną čia, kad kai rašote kai kurias funkcijas 253 00:15:32,110 --> 00:15:36,790 , kad jūs norite, kad kiti žmonės galės naudoti, kuri yra būtent tuo atveju, su CS50 bibliotekoje, 254 00:15:36,790 --> 00:15:40,900 jūs ne tik įgyvendinti savo funkcijas kažką panašaus CS50.c 255 00:15:40,900 --> 00:15:46,720 jūs taip pat įdėti prototipus ne dėl šios bylos viršuje, tačiau antraštės failo viršuje 256 00:15:46,720 --> 00:15:50,810 tada, kad failo antraštės yra tai, ką draugai ir kolegos, 257 00:15:50,810 --> 00:15:52,800 su aštriais savo kodą. 258 00:15:52,800 --> 00:15:55,440 Taigi visą šį laiką buvote įskaitant visus iš šių prototipų 259 00:15:55,440 --> 00:15:59,870 efektyviai failo viršuje, bet tai aštrus mechanizmą 260 00:15:59,870 --> 00:16:03,320 , kad iš esmės šį failą į savo kopijas ir pastos. 261 00:16:03,320 --> 00:16:06,400 Dabar, čia yra keletas gana išsamūs dokumentai. 262 00:16:06,400 --> 00:16:08,880 >> Mes beveik savaime suprantamu dalyku kad GetInt gauna int, 263 00:16:08,880 --> 00:16:10,740 tačiau paaiškėja, yra kai kampiniai atvejų, tiesa? 264 00:16:10,740 --> 00:16:14,320 Ką daryti, jei vartotojas įveda kelias pernelyg didelis skaičius, kad? 265 00:16:14,320 --> 00:16:17,350 Quintillion, kad tiesiog negali tilpti int? 266 00:16:17,350 --> 00:16:21,180 Koks numatomas elgesys? Na, geriausia, tai nuspėjamas. 267 00:16:21,180 --> 00:16:23,460 Taigi šiuo atveju, jei jūs iš tikrųjų skaityti baudos spausdinti, 268 00:16:23,460 --> 00:16:27,850 pamatysite, kad jei linija negali būti perskaityti, tai grąžina INT_MAX. 269 00:16:27,850 --> 00:16:30,800 Mes niekada kalbėjo apie tai, bet remiantis jos kapitalizacijoje, 270 00:16:30,800 --> 00:16:33,030 kas tai yra, tikriausiai? 271 00:16:33,030 --> 00:16:36,610 Tai pastovi, todėl tai kai speciali konstanta, tikriausiai, 272 00:16:36,610 --> 00:16:39,460 'S UP didesnis failo šių header files, 273 00:16:39,460 --> 00:16:43,400 ir INT_MAX tikriausiai yra kažkas panašaus, maždaug, 2 milijardų. 274 00:16:43,400 --> 00:16:48,160 Idėja yra ta, kad, nes mes turime kažkaip reiškia, kad kažkas negerai, 275 00:16:48,160 --> 00:16:51,090 mes, taip, ar 4 mlrd. skaičius mūsų žinioje, 276 00:16:51,090 --> 00:16:53,980 neigiamas 2 mlrd iki 2 milijardų, duoti ar priimti. 277 00:16:53,980 --> 00:16:58,030 Na, kas yra bendra programavimo jūs pavogti tik vieną iš šių numerių. 278 00:16:58,030 --> 00:17:02,250 Gal 0, o gal 2 mlrd., O gal neigiamas 2 mlrd. 279 00:17:02,250 --> 00:17:06,720 Taigi jūs prarandate vieną iš savo galimų reikšmių, kad būtų galima įsipareigoti pasaulyje 280 00:17:06,720 --> 00:17:10,089 , kad jei kas nors negerai, aš grįšiu tai super neįkainojamos vertės. 281 00:17:10,089 --> 00:17:13,329 Bet nenorite vartotojo įvedę kažkas yra neaiškūs, pavyzdžiui, "2, 3, 4 ..." 282 00:17:13,329 --> 00:17:17,079 tikrai didelis skaičius, kur apibendrinti, o ne kaip konstanta. 283 00:17:17,079 --> 00:17:19,380 Ir tikrai, jei jums buvo analinis pastaruosius keletą savaičių, 284 00:17:19,380 --> 00:17:23,800 kada jūs vadinate GetInt, turėtumėte buvo patikrinti jei sąlyga. 285 00:17:23,800 --> 00:17:27,109 Ar vartotojo tipą INT_MAX, arba, tiksliau, 286 00:17:27,109 --> 00:17:29,900 padarė GetInt grįžti INT_MAX? Nes jei jis tai padarė, 287 00:17:29,900 --> 00:17:35,140 kad iš tikrųjų reiškia, kad jie nebuvo įveskite jį kažkas nutiko šiuo atveju. 288 00:17:35,140 --> 00:17:38,970 Taigi, tai yra tai, kas paprastai žinomas kaip vertės "Sentinel", kuris tiesiog reiškia specialiuosius. 289 00:17:38,970 --> 00:17:41,020 >> Na, tegul dabar kreiptis į C failus. 290 00:17:41,020 --> 00:17:44,500 C failas egzistuoja prietaiso tam tikrą laiką, 291 00:17:44,500 --> 00:17:47,540 ir, tiesą sakant, kad prietaisas turi tai išankstinė sukompiliuota jums 292 00:17:47,540 --> 00:17:49,720 į tą daiktą, mes vadinamas "objekto kodas" 293 00:17:49,720 --> 00:17:52,940 bet jis tiesiog nėra klausimas jums, kur jis yra, nes sistema žino, 294 00:17:52,940 --> 00:17:54,780 šiuo atveju, kur ji yra, prietaisas. 295 00:17:54,780 --> 00:18:00,620 Bet tegul slinkti žemyn dabar GetInt, ir pamatyti, kaip GetInt dirbo visą šį laiką. 296 00:18:00,620 --> 00:18:02,380 Taigi čia mes turime panašias pastabas anksčiau. 297 00:18:02,380 --> 00:18:04,930 Leiskite man priartinti tik kodo dalis, 298 00:18:04,930 --> 00:18:07,410 ir tai, ką mes turime GetInt tokia. 299 00:18:07,410 --> 00:18:12,770 Ji nežino įvestį ir grąžina int, while (true), todėl mes turime sąmoningai begalinis ciklas 300 00:18:12,770 --> 00:18:16,560 , bet, matyt, mes išeiti tai kažkaip, ar grįžti iš per šį laikotarpį. 301 00:18:16,560 --> 00:18:19,890 Taigi pažiūrėkime, kaip tai veikia. Na, mes, atrodo, kad naudojant GetString 302 00:18:19,890 --> 00:18:22,550 šioje pirmoje eilutėje viduje kilpa, 166. 303 00:18:22,550 --> 00:18:25,320 Šiuo metu tai yra gera praktika, nes, kokiomis aplinkybėmis 304 00:18:25,320 --> 00:18:30,820 gali GetString grąžinti šį specialų raktažodžių, NULL? 305 00:18:30,820 --> 00:18:38,460 Jei kažkas negerai. Kas galėtų suklysti, kai skambinate kažką panašaus GetString? 306 00:18:38,460 --> 00:18:42,550 Taip? [Studento atsakymas, nesuprantamas] >> Taip. Taigi gal malloc nepavyksta. 307 00:18:42,550 --> 00:18:45,310 Kažkur po gaubtu GetString skambina malloc 308 00:18:45,310 --> 00:18:48,210 skiria atmintį, kuri leidžia kompiuterių parduotuvėje 309 00:18:48,210 --> 00:18:50,950 visus simbolius, kad vartotojas įveda klaviatūra. 310 00:18:50,950 --> 00:18:53,270 Ir tarkime, vartotojas gavo visai daug laisvo laiko 311 00:18:53,270 --> 00:18:56,470 ir atspausdinti daugiau nei 2 mlrd simbolių, pavyzdžiui,. 312 00:18:56,470 --> 00:18:59,600 Daugiau simbolių, nei kompiuterio, net RAM. 313 00:18:59,600 --> 00:19:02,350 Na, GetString turi būti galėtų reikšti, kad jums, 314 00:19:02,350 --> 00:19:05,650 net jei tai yra super, super neįprasta kampe atveju. 315 00:19:05,650 --> 00:19:08,490 Jis turi kažkaip būti galėtų dirbti, ir taip GetString, 316 00:19:08,490 --> 00:19:11,850 jei mes einame atgal ir perskaityti jo dokumentus, iš tikrųjų, grįžti NULL. 317 00:19:11,850 --> 00:19:16,150 Dabar, jei GetString nepavyksta grąžinant NULL, GetInt žlugti 318 00:19:16,150 --> 00:19:19,370 grįžti INT_MAX, tiesiog kaip Sentinel. 319 00:19:19,370 --> 00:19:22,650 Tai tik žmogaus konvencijas. Vienintelis būdas turėtumėte žinoti, yra tuo atveju, 320 00:19:22,650 --> 00:19:24,840 skaityti dokumentus. 321 00:19:24,840 --> 00:19:28,200 Taigi leiskite slinkite žemyn, kur int yra iš tikrųjų GotInt. 322 00:19:28,200 --> 00:19:34,220 >> Taigi, jei aš slinkti žemyn šiek tiek toliau, atitinka 170 turime virš šių eilučių komentarą. 323 00:19:34,220 --> 00:19:38,470 Taigi, mes pareiškiame, 172, int n, char c, ir tada šios naujos funkcijos 324 00:19:38,470 --> 00:19:41,870 kai kurie iš jūsų szarpnęły visoje prieš, bet sscanf. 325 00:19:41,870 --> 00:19:44,190 Tai reiškia styginių nuskaitymo f. 326 00:19:44,190 --> 00:19:48,580 Kitaip tariant, duok eilutę ir bus nuskaityti informacijos vienetų interesų. 327 00:19:48,580 --> 00:19:53,820 Taigi, ką tai reiškia? Na, tarkime, kad aš tipo, tiesiog 1 2 3 prie klaviatūros, 328 00:19:53,820 --> 00:19:59,730 ir tada paspauskite Enter. Kas yra duomenų tipas 1 2 3 sugrįžę GetString? 329 00:19:59,730 --> 00:20:05,010 Tai akivaizdžiai eilutę, tiesa? Aš turiu eilutę, todėl 1 2 3 yra tikrai "1 2 3" 330 00:20:05,010 --> 00:20:07,260 \ 0 "jo pabaigoje. Tai ne int. 331 00:20:07,260 --> 00:20:10,420 Kad ne skaičius. Atrodo, kad skaičius, bet iš tikrųjų tai ne. 332 00:20:10,420 --> 00:20:14,680 Taigi, ką GetInt daryti? Ji turi nuskaityti, kad eilutę, iš kairės į dešinę, 333 00:20:14,680 --> 00:20:19,010 1 2 3 \ 0, ir kažkaip konvertuoti jį į faktinį sveikojo skaičiaus. 334 00:20:19,010 --> 00:20:21,010 Dabar galite išsiaiškinti, kaip tai padaryti. 335 00:20:21,010 --> 00:20:24,240 Jei manote, kad atgal į pset 2, jūs tikriausiai gavo šiek tiek patogiai 336 00:20:24,240 --> 00:20:26,810 su Cezaris ar Vigenere taip galite pakartoti per eilutę, 337 00:20:26,810 --> 00:20:29,800 galite konvertuoti simbolių int su pick. Tai visai daug darbo. 338 00:20:29,800 --> 00:20:32,800 Kodėl gi ne skambinti kaip sscanf funkcija, kad visa tai už jus? 339 00:20:32,800 --> 00:20:37,520 Taigi sscanf tikisi argumentas, šiuo atveju vadinama linija, kuri yra eilutė. 340 00:20:37,520 --> 00:20:41,310 Jūs tada nurodykite, į kabutes, labai panašus į printf, 341 00:20:41,310 --> 00:20:44,960 ko jūs tikitės pamatyti šios eilutės? 342 00:20:44,960 --> 00:20:52,980 Ką aš sakau čia, tikiuosi, į dešimtainį skaičių, o gal ir simbolį. 343 00:20:52,980 --> 00:20:54,990 Ir mes pamatyti, kodėl tai yra vos akimirką. 344 00:20:54,990 --> 00:20:58,440 Pasirodo, kad šį formatą dabar primena daiktų 345 00:20:58,440 --> 00:21:00,840 mes pradėjome kalbėti apie šiek tiek daugiau nei prieš savaitę. 346 00:21:00,840 --> 00:21:05,430 >> Kas yra ir nanotechnologijų ir c daro mums čia? [Studentų atsakymai, neįskaitomai] 347 00:21:05,430 --> 00:21:07,610 >> Taip. Tai, kad suteikėte man n ir adresas c adresą. 348 00:21:07,610 --> 00:21:10,440 Dabar, kodėl tai svarbu? Na, žinote, kad su funkcijų C 349 00:21:10,440 --> 00:21:13,440 jūs visada galite grįžti reikšmę arba jokios vertės. 350 00:21:13,440 --> 00:21:16,630 Galite grįžti Žiniasklaida, eilutę, apyvartinės lėšos, char, neatsižvelgiant į. 351 00:21:16,630 --> 00:21:21,150 Arba galite grįžti negaliojančiu, bet jūs galite grįžti tik 1 dalykas maksimaliai. 352 00:21:21,150 --> 00:21:26,100 Bet čia mes norime sscanf gal man grįžti Žiniasklaida, dešimtainis skaičius, 353 00:21:26,100 --> 00:21:29,240 ir taip pat char, ir aš paaiškinti, kodėl char per akimirką. 354 00:21:29,240 --> 00:21:34,250 Taigi jums efektyviai norite f, kad grįžti 2 dalykų, kad tiesiog neįmanoma C. 355 00:21:34,250 --> 00:21:38,460 , Todėl galite dirbti aplink, einančios per 2 adresus, 356 00:21:38,460 --> 00:21:43,710 nes kuo greičiau vertus funkcija 2 adresus, ką gali, kad funkcija su jais daryti? 357 00:21:43,710 --> 00:21:49,880 Gali rašyti šiais adresais. Galite naudoti * operaciją ir "ten" į kiekvieną iš šių adresų. 358 00:21:49,880 --> 00:21:54,320 Tai tarsi šio backdoor mechanizmą, tačiau labai dažnai keičiasi kintamųjų reikšmes 359 00:21:54,320 --> 00:21:58,020 daugiau nei 1 vietos, šiuo atveju 2. 360 00:21:58,020 --> 00:22:04,590 Dabar, atkreipkite dėmesį, aš patikrinti == to1, ir tada grįžti n jeigu tai, iš tiesų, įvertinti, tiesa. 361 00:22:04,590 --> 00:22:09,340 Taigi, kas vyksta? Na, techniškai, visi mes tikrai norime, kad taip atsitiktų, GetInt tai. 362 00:22:09,340 --> 00:22:12,340 Mes norime, kad apdoroti, taip sakant, norime skaityti eilutę 363 00:22:12,340 --> 00:22:16,210 "1 2 3", o jei jis atrodo, kaip ten numeris yra, 364 00:22:16,210 --> 00:22:21,360 tai, ką mes sakau sscanf tai padaryti, yra įdėti, kad, 1 2 3 man į šį kintamąjį rodiklį n. 365 00:22:21,360 --> 00:22:26,060 Kodėl, tuomet, aš tai, kaip gerai? 366 00:22:26,060 --> 00:22:33,750 Kas yra taip pat sako, sscanf, jūs taip pat gali gauti simbolį čia vaidmuo. 367 00:22:33,750 --> 00:22:36,890 [Studentų sakant, nesuprantamas] >> Ne - dešimtainis taškas galėtų dirbti. 368 00:22:36,890 --> 00:22:40,650 Leiskite nuspręsti, kad akimirką pagalvojo. Ką dar? 369 00:22:40,650 --> 00:22:42,570 [Studentas, nesuprantamas] >> Taigi, gera mintis, tai gali būti NULL charakteris. 370 00:22:42,570 --> 00:22:44,970 Tai tikrai ne šiuo atveju. Taip? [Studentų, nesuprantamas] 371 00:22:44,970 --> 00:22:47,100 >> >> ASCII. Arba, leiskite man apibendrinti dar labiau. 372 00:22:47,100 --> 00:22:49,670 % C yra tik Klaidų tikrinimas. 373 00:22:49,670 --> 00:22:52,510 Mes nenorime, kad po skaičiaus pobūdis, 374 00:22:52,510 --> 00:22:54,980 bet ką tai leidžia man padaryti taip: 375 00:22:54,980 --> 00:23:01,270 Pasirodo, kad sscanf, be to, n ir C saugoti vertybes, šiame pavyzdyje čia, 376 00:23:01,270 --> 00:23:08,170 ką jis taip pat tai grąžina kintamųjų skaičius įdėti vertybes in 377 00:23:08,170 --> 00:23:13,330 Taigi, jei turite tik įvesti 1 2 3, tada tik% d, kad atitiktų 378 00:23:13,330 --> 00:23:18,830 ir tik n pasireiškia saugomi kaip 1 2 3 ir nieko gauna įdėti į C; 379 00:23:18,830 --> 00:23:20,870 c reikšmė lieka šiukšlių, taip sakant. 380 00:23:20,870 --> 00:23:23,550 Šiukšlių, nes ji niekada nebuvo inicializuoti kokią vertę. 381 00:23:23,550 --> 00:23:29,390 Taigi, tuo atveju, sscanf grąžina 1, nes aš apgyvendintos vieną iš šių rodykles, 382 00:23:29,390 --> 00:23:33,650 tokiu atveju, nuostabu. Turiu int, todėl aš išlaisvinti liniją atlaisvinti atminties 383 00:23:33,650 --> 00:23:37,150 , kad GetString faktiškai skirta, ir tada aš grįžti n. 384 00:23:37,150 --> 00:23:42,210 Kitur, jei jūs kada nors susimąstėte, kur, kad pabandyti dar kartą pareiškimas nuskambėjo, ateina iš čia. 385 00:23:42,210 --> 00:23:45,770 Jei, priešingai, aš tipo 1 2 3 foo 386 00:23:45,770 --> 00:23:48,640 tik keletas atsitiktinai teksto seka, sscanf vyksta pamatyti, 387 00:23:48,640 --> 00:23:51,500 ooh, skaičių, ooh, skaičių, ooh, skaičių, ooh - f. 388 00:23:51,500 --> 00:23:54,190 Ir tai vyksta įdėti 1 2 3 n. 389 00:23:54,190 --> 00:23:59,970 Ji ketina įdėti c f, ir tada grįžkite 2. 390 00:23:59,970 --> 00:24:02,980 Taigi, mes turime, tik naudojant pagrindinį apibrėžimą scanf elgesį, 391 00:24:02,980 --> 00:24:06,170 labai paprastas būdas - gerai, sudėtinga iš pirmo žvilgsnio, bet ne dienos pabaigoje, 392 00:24:06,170 --> 00:24:11,460 gana paprastas mechanizmas pasakyti, ar yra int, ir jei taip, tai, kad vienintelis dalykas, kad aš rasiu? 393 00:24:11,460 --> 00:24:14,950 Ir čia yra tarpas tyčinis. Jei jūs skaitote kad sscanf dokumentus, 394 00:24:14,950 --> 00:24:18,690 jis jums pasakys, kad jei yra tuščios vietos gabalo pradžioje arba pabaigoje, 395 00:24:18,690 --> 00:24:24,990 sscanf taip pat leidžia vartotojui, neatsižvelgiant į priežastis, kad pasiektų tarpo 1 2 3, ir kad bus teisėtas. 396 00:24:24,990 --> 00:24:28,310 Tai bus ne klykauti ne tik todėl, kad jie nukentėjo tarpo pradžioje arba pabaigoje vartotojo, 397 00:24:28,310 --> 00:24:32,160 kuris yra tik šiek tiek patogesnis. 398 00:24:32,160 --> 00:24:34,160 >> Bet kokių klausimų, tada ant GetInts? Taip? 399 00:24:34,160 --> 00:24:36,820 [Studento klausimas, nesuprantamas] 400 00:24:36,820 --> 00:24:40,740 >> Geras klausimas. Ką daryti, jei jūs tiesiog atspausdinti char, kaip f ir paspauskite įvesti 401 00:24:40,740 --> 00:24:47,830 be galimybės kada nors rašyti 1 2 3 ką jūs manote elgesys šio kodo eilutę, tada būtų? 402 00:24:47,830 --> 00:24:50,500 Taigi sscanf gali apimti, kad per daug, nes tuo atveju, 403 00:24:50,500 --> 00:24:56,280 jis nesiruošia užpildyti N arba C; ji ketina vietoj return 0. 404 00:24:56,280 --> 00:25:01,540 Tokiu atveju, aš taip pat gaudyti, kad scenarijų,, nes laukiama vertė aš noriu yra 1. 405 00:25:01,540 --> 00:25:07,310 Aš tik noriu 1, ir tik 1 dalykas, kurį reikia užpildyti. Geras klausimas. Kiti? 406 00:25:07,310 --> 00:25:09,610 >> Viskas gerai, todėl galime ne eiti per visus čia funkcijų, 407 00:25:09,610 --> 00:25:11,820 bet vienas, kad atrodo, kad, ko gero, likusių susidomėjimu 408 00:25:11,820 --> 00:25:14,530 yra GetString nes paaiškėja, kad GetFloat, GetInt 409 00:25:14,530 --> 00:25:19,490 GetDouble, GetLongLong visus išmušti kamuolį iš rankų, daug jų funkcionalumą GetString. 410 00:25:19,490 --> 00:25:22,860 Todėl galime imtis, kaip jis yra įgyvendinamas išvaizdą. 411 00:25:22,860 --> 00:25:27,040 Tai vienas atrodo šiek tiek sudėtinga, bet ji naudoja tuos pačius pagrindus 412 00:25:27,040 --> 00:25:29,680 , kad mes pradėjome kalbėti apie praeitą savaitę. Taigi GetString 413 00:25:29,680 --> 00:25:32,670 kuris trunka jokio argumento, kaip už tuštumos čia, 414 00:25:32,670 --> 00:25:37,110 ir grąžina eilutę, kad aš esu skelbiantis eilutę vadinamas buferis. 415 00:25:37,110 --> 00:25:39,670 Aš ne tikrai žinote, kas tai bus naudojamas dar, bet mes žr. 416 00:25:39,670 --> 00:25:42,950 Pajėgumų atrodo kaip yra pagal nutylėjimą, 0, ne visai tikras, kur tai vyksta. 417 00:25:42,950 --> 00:25:44,920 Nežinote, ką n bus naudojamas dar. 418 00:25:44,920 --> 00:25:47,860 Bet dabar ji gauti šiek tiek įdomesnis, todėl 243 eilutėje, 419 00:25:47,860 --> 00:25:51,760 mes pareiškiame, int c, tai yra tarsi kvailas išsamiai. 420 00:25:51,760 --> 00:25:58,080 Char yra 8 bitų, ir 8 bitai gali laikyti kiek skirtingas reikšmes? 421 00:25:58,080 --> 00:26:03,310 256. Problema yra, jei norite turėti 256 skirtingų ASCII simbolių, 422 00:26:03,310 --> 00:26:06,210 yra, jei jūs manote, atgal, ir tai nėra kažkas, įsiminti. 423 00:26:06,210 --> 00:26:09,100 Bet jeigu jūs manote, kad didelis ASCII diagramos mes turėjome savaites, 424 00:26:09,100 --> 00:26:13,780 ten buvo, šiuo atveju, 128 arba 256 ASCII simbolių. 425 00:26:13,780 --> 00:26:16,220 Mes naudojome nuo 0 modelius ir 1'S UP. 426 00:26:16,220 --> 00:26:19,410 Tai problema, jei norite, kad būtų galima aptikti klaidą. 427 00:26:19,410 --> 00:26:23,290 Nes jei jūs jau naudojate 256 simbolių reikšmes, 428 00:26:23,290 --> 00:26:26,390 ne jūs planuojate į priekį, nes dabar jūs neturite sakydamas kelią, 429 00:26:26,390 --> 00:26:29,750 "Tai nėra teisėtas simbolis, tai yra, kai klaidingas pranešimas". 430 00:26:29,750 --> 00:26:32,430 Taigi, ką pasaulis daro, jie naudoja kitą didžiausią vertę, 431 00:26:32,430 --> 00:26:35,790 int kažkas panašaus, kad jūs turite crazy bitų skaičius, 432 00:26:35,790 --> 00:26:39,610 32 už 4 milijardų galimų reikšmių, taip, kad jūs galite tiesiog baigti naudojant, 433 00:26:39,610 --> 00:26:44,800 iš esmės, 257 iš jų, iš kurių 1 turi tam tikrą ypatingą reikšmę kaip klaida. 434 00:26:44,800 --> 00:26:49,190 >> Taigi pažiūrėkime, kaip tai veikia. 246 atitinka, turiu tai didelis while cikle 435 00:26:49,190 --> 00:26:54,530 ragina fgetc f reikšmė failas, getc, ir tada stdin. 436 00:26:54,530 --> 00:26:59,030 Pasirodo, tai tik tikslesnis būdas pasakyti "Skaityti įvesties iš klaviatūros". 437 00:26:59,030 --> 00:27:02,730 Standartinis įvesties tai klaviatūra, standartinį išvedimo ekraną, 438 00:27:02,730 --> 00:27:06,920 ir standartinė paklaida, kurią mes matysite pset 4 - ekraną, 439 00:27:06,920 --> 00:27:09,670 bet specialų ekrano dalį taip, kad ji ne supainiojo 440 00:27:09,670 --> 00:27:13,760 faktinės produkcijos, kad jums skirtas spausdinti, bet daugiau apie tai ateityje. 441 00:27:13,760 --> 00:27:19,430 Taigi fgetc tik perskaityti vieną simbolį iš klaviatūros, ir laikyti jį ten, kur? 442 00:27:19,430 --> 00:27:24,000 Laikykite jį į C, o tada patikrinkite, todėl aš tiesiog naudojant kai kuriuos boolean jungtukai, 443 00:27:24,000 --> 00:27:28,430 patikrinkite, ar jis nėra lygus \ n, todėl vartotojas paspauskite Enter. 444 00:27:28,430 --> 00:27:31,510 Mes norime sustabdyti tuo momentu, kilpos pabaigos, ir mes taip pat norite patikrinti 445 00:27:31,510 --> 00:27:36,170 speciali konstanta, EOF, jei žinote, ar atspėti - kas tai stovėti? 446 00:27:36,170 --> 00:27:39,860 Failo pabaigos. Taigi tai yra rūšies absurdiškas, nes jei aš rašyti į klaviatūrą, 447 00:27:39,860 --> 00:27:41,900 ten tikrai ne failas, dalyvauti šiame, 448 00:27:41,900 --> 00:27:44,330 bet tai tik rūšiuoti reiškia bendrinis terminas, naudojamas 449 00:27:44,330 --> 00:27:50,320 kad nieko ateina iš žmogaus pirštų. EOF. Failo pabaigos. 450 00:27:50,320 --> 00:27:52,600 Kaip panaikinti, jei jūs kada nors nukentėjo valdymas D savo klaviatūroje, 451 00:27:52,600 --> 00:27:54,680 nereiškia, kad jūs dar, jūs nukentėjo valdymo C. 452 00:27:54,680 --> 00:27:57,920 O kontrolė d siunčia šį specialų nuolatinį, pavadintą EOF. 453 00:27:57,920 --> 00:28:03,100 >> Taigi, dabar mes tiesiog turime tam tikrą dinaminį atminties paskirstymas. 454 00:28:03,100 --> 00:28:06,460 Taigi, jei n + 1> talpa, dabar aš paaiškinti n. 455 00:28:06,460 --> 00:28:09,380 n, kiek baitų yra buferyje, 456 00:28:09,380 --> 00:28:11,970 eilutė, kad jūs šiuo metu iš vartotojo. 457 00:28:11,970 --> 00:28:16,240 Jei turite daugiau simbolių savo buferio nei turite pajėgumus buferyje, 458 00:28:16,240 --> 00:28:20,760 intuityviai, tai, ką mes turime daryti tada skirti daugiau pajėgumų. 459 00:28:20,760 --> 00:28:24,490 Aš ruošiuosi nugriebti kai aritmetinio čia 460 00:28:24,490 --> 00:28:26,900 ir sutelkti dėmesį tik šią funkciją. 461 00:28:26,900 --> 00:28:29,170 Jūs žinote, ką malloc yra, ar bent jau paprastai susipažinę. 462 00:28:29,170 --> 00:28:32,380 Spėti, kas realloc daro. [Studentų atsakymas, nesuprantamas] 463 00:28:32,380 --> 00:28:35,690 >> Taip. Ir tai ne visai pridedant atminties, ji perskirsto atmintį taip: 464 00:28:35,690 --> 00:28:40,530 Jei dar yra kambarys eilutės pabaigoje, kad suteiktų jums daugiau, kad atmintis 465 00:28:40,530 --> 00:28:43,370 nei ji iš pradžių suteikia jums, tada jums gauti, kad papildomos atminties. 466 00:28:43,370 --> 00:28:46,640 Taigi galite tiesiog pradėti eilutes simbolių atgal atgal atgal atgal. 467 00:28:46,640 --> 00:28:49,290 Bet jei tai ne tas atvejis, nes jūs pernelyg ilgai laukė, 468 00:28:49,290 --> 00:28:51,700 ir kažkas atsitiktinai gavo plopped į atmintį, bet ten papildomai 469 00:28:51,700 --> 00:28:56,480 atminties žemai čia, kad viskas gerai. Realloc ketina padaryti viską, didelių svorių iškėlimą už jus, 470 00:28:56,480 --> 00:28:58,810 perkelti eilutę, jūs perskaitėte, kad iki šiol čia, 471 00:28:58,810 --> 00:29:02,550 padėkite jį ten, ir tada duoti jums šiek tiek daugiau taką šiuo klausimu. 472 00:29:02,550 --> 00:29:05,610 Taigi su rankos banga, leiskite man pasakyti, kad tai, ką GetString daro 473 00:29:05,610 --> 00:29:09,540 ji pradeda su nedideliu buferio, gal 1 vieną simbolį, 474 00:29:09,540 --> 00:29:12,300 ir, jei vartotojas įveda į 2 simbolių, GetString baigiasi 475 00:29:12,300 --> 00:29:15,210 paskambinus realloc ir sako: "Ooh, 1 pobūdis buvo nepakankamai. 476 00:29:15,210 --> 00:29:18,480 Duok man 2 simboliai. " Tada, jei jūs skaityti per kilpą logika, 477 00:29:18,480 --> 00:29:21,070 ji ketina pasakyti "Ooh, 3 simbolių įvedėte vartotojo. 478 00:29:21,070 --> 00:29:25,690 Duok man dabar ne 2, bet 4 ženklai, tada duok man 8, tada duok man 16 ir 32. " 479 00:29:25,690 --> 00:29:28,180 Tai, kad aš kiekvieną kartą padvigubinti Gebėjimų 480 00:29:28,180 --> 00:29:30,320 reiškia, kad buferis nesiruošia auga lėtai. 481 00:29:30,320 --> 00:29:35,870 Jis ketina super greitai auga, ir kas gali būti, kad privalumas? 482 00:29:35,870 --> 00:29:38,540 Kodėl aš dvigubai buferio dydį, net jei vartotojas 483 00:29:38,540 --> 00:29:41,450 gali tiesiog reikia 1 papildomų simbolių iš klaviatūros? 484 00:29:41,450 --> 00:29:44,830 [Studento atsakymas, nesuprantamas]. >> Kas tai? 485 00:29:44,830 --> 00:29:46,750 Tiksliai. Jūs neturite auginti jį taip dažnai. 486 00:29:46,750 --> 00:29:48,870 Ir tai tik rūšies - Tu apsidraudimo savo statymus čia. 487 00:29:48,870 --> 00:29:54,150 Remiamasi idėja, kad jums nereikia skambinti realloc daug, nes jis linkęs būti lėtas. 488 00:29:54,150 --> 00:29:56,840 Bet kuriuo metu galite paklausti operacinės sistemos atminties, kaip jūs netrukus pamatysite, 489 00:29:56,840 --> 00:30:00,620 problemos ateityje rinkinį, jis yra linkęs šiek tiek laiko. 490 00:30:00,620 --> 00:30:04,980 Taip sumažinti, kad, kiek laiko, net jei jūs eikvoti šiek tiek erdvės, yra linkęs būti geras dalykas. 491 00:30:04,980 --> 00:30:07,250 >> Bet jei mes skaityti per baigiamoji dalis GetString čia, 492 00:30:07,250 --> 00:30:10,880 ir vėl, suprasti kiekvieną eilutę čia nėra taip svarbu šiandien. 493 00:30:10,880 --> 00:30:14,830 Bet pastebėsite, kad ji galiausiai ragina malloc vėl, ir ji išskirsto 494 00:30:14,830 --> 00:30:16,980 tiksliai taip, kaip daug baitų kaip jai reikia eilutę 495 00:30:16,980 --> 00:30:21,620 ir tada išmeta paskambinus nemokamai, pernelyg didelis buferis, 496 00:30:21,620 --> 00:30:23,510 jei ji iš tikrųjų gavo dvigubai per daug kartų. 497 00:30:23,510 --> 00:30:25,970 Trumpai tariant, tai, kaip GetString dirbo visą šį laiką. 498 00:30:25,970 --> 00:30:30,100 Visi jame skaityti vieną simbolį vienu metu vėl ir vėl ir vėl 499 00:30:30,100 --> 00:30:37,930 ir kiekvieną kartą, ji reikia šiek tiek papildomos atminties, jis klausia, operacinę sistemą paskambinus realloc. 500 00:30:37,930 --> 00:30:41,660 Turite klausimų? Gerai. 501 00:30:41,660 --> 00:30:45,220 >> Ataka. Dabar, kai mes suprantame patarimų, ar bent jau 502 00:30:45,220 --> 00:30:47,560 vis labiau susipažinę su rodyklės, 503 00:30:47,560 --> 00:30:50,020 pažiūrėkime, kaip visas pasaulis pradeda žlugti 504 00:30:50,020 --> 00:30:53,160 jei jūs neturite pakankamai ginti nuo rungimosi vartotojams, 505 00:30:53,160 --> 00:30:55,180 žmonių, kurie bando nulaužti į savo sistemą. 506 00:30:55,180 --> 00:31:00,260 Žmonių, kurie bando pavogti jūsų registracijos kodą apeiti tam tikrą programinę įrangą 507 00:31:00,260 --> 00:31:02,150 kad jie gali kitaip įvesti in 508 00:31:02,150 --> 00:31:04,860 Paimkite pažvelgti į šį pavyzdį, kuri yra tik C kodas 509 00:31:04,860 --> 00:31:07,920 , kad turi pagrindinę funkciją apačioje, kad skambučiai funkcija foo 510 00:31:07,920 --> 00:31:12,100 ir nuo ko jis artimųjų foo? [Studentų] Vienintelis argumentas. 511 00:31:12,100 --> 00:31:15,660 >> Vieną argumentą. Taigi argv [1], kuris reiškia pirmąjį žodį, vartotojas turi įvesti 512 00:31:15,660 --> 00:31:19,150 į komandų eilutę po a.out ar kas programa vadinama. 513 00:31:19,150 --> 00:31:24,920 Taigi foo, viršuje, mano char *, bet char * yra tai, ką? 514 00:31:24,920 --> 00:31:28,860 Eilutę. Nieko naujo čia, kad seka yra savavališkai yra vadinamas baras. 515 00:31:28,860 --> 00:31:36,090 Šioje eilutėje čia, char c [12], tarsi pusiau techninės anglų, kas ši eilutė daro? 516 00:31:36,090 --> 00:31:40,640 Masyvas? Simbolių. Duok man 12 simbolių masyvas. 517 00:31:40,640 --> 00:31:44,970 Taigi galėtume pavadinti tai buferis. Techniškai vadinama c, bet programavimo buferis 518 00:31:44,970 --> 00:31:47,890 tiesiog reiškia, kad vietos krūva, kad jūs galite įdėti kai kurių dalykų in 519 00:31:47,890 --> 00:31:49,940 >> Tada galiausiai, memcpy, mes ne naudoti prieš. 520 00:31:49,940 --> 00:31:52,380 , Bet jūs greičiausiai gali atspėti, ką ji daro. Kopijuoja atmintį. 521 00:31:52,380 --> 00:31:58,790 Ką jis daro? Na, tai, matyt, kopijuoja baras, jo indėlis į c, 522 00:31:58,790 --> 00:32:03,420 bet tik iki juostos ilgis. 523 00:32:03,420 --> 00:32:07,440 Bet ten klaida čia. 524 00:32:07,440 --> 00:32:14,500 Gerai, kad techniškai turėtume tikrai strlen (bar) x sizeof (char), tai teisinga. 525 00:32:14,500 --> 00:32:17,920 Bet blogiausiu atveju čia, galime manyti, kad that - taip, gerai. 526 00:32:17,920 --> 00:32:23,760 Tada ten 2 klaidas. Taigi, sizeof (char), gerai, padarykime tai šiek tiek platesnis. 527 00:32:23,760 --> 00:32:28,860 Taigi, dabar dar yra klaida, o tai, ką? 528 00:32:28,860 --> 00:32:31,630 [Studentų atsakymas, nesuprantamas] >> išsiregistravimo už ką? Gerai, kad mes turime būti patikrinti 529 00:32:31,630 --> 00:32:35,010 , nes blogų dalykų atsitikti, kai jūsų rodyklė NULL, NULL 530 00:32:35,010 --> 00:32:38,490 , Nes jums gali galų gale vyksta ten, ir jūs niekada neturėtų būti NULL 531 00:32:38,490 --> 00:32:40,890 su * operatoriumi dereferencing. 532 00:32:40,890 --> 00:32:45,250 Taigi, kad gerai, ir ką mes darome? Logiškai trūkumas čia. 533 00:32:45,250 --> 00:32:47,650 [Studentų atsakymas, nesuprantamas] 534 00:32:47,650 --> 00:32:51,340 >> Taigi patikrinti, ar argc ≥ 2? 535 00:32:51,340 --> 00:32:54,130 Gerai, kad yra 3 klaidas šioje programoje. 536 00:32:54,130 --> 00:33:00,080 Mes ne tikrinti, ar vartotojas iš tikrųjų įvedėte nieko į argv [1], geros. 537 00:33:00,080 --> 00:33:02,240 Taigi, kas yra trečiasis klaidą? Taip? 538 00:33:02,240 --> 00:33:04,420 [Studento atsakymas, nesuprantamas] >> Gerai. 539 00:33:04,420 --> 00:33:09,590 Taigi, mes patikrinome vieną scenarijų. Mes netiesiogiai patikrinti negalima kopijuoti daugiau atminties 540 00:33:09,590 --> 00:33:12,800 nei viršytų juostos ilgis. 541 00:33:12,800 --> 00:33:15,720 Taigi, jei eilutė vartotojas turi įvesti 10 simbolių, 542 00:33:15,720 --> 00:33:18,260 tai sako, "tik kopija 10 simbolių. 543 00:33:18,260 --> 00:33:21,140 Ir tai gerai, bet ką daryti, jei vartotojas turi įvesti žodį komandinėje eilutėje 544 00:33:21,140 --> 00:33:29,360 kaip 20 simbolių žodį, tai yra, sakydamas kopijavimo 20 simbolių iš baro į tai, ką? 545 00:33:29,360 --> 00:33:32,840 c, kitaip žinoma kaip mūsų buferio, kuris reiškia, kad jūs tiesiog parašė duomenis 546 00:33:32,840 --> 00:33:35,950 8 baitų vietose, kad jūs neturite savo, 547 00:33:35,950 --> 00:33:38,320 ir jūs neturite juos ta prasme, kad jūs niekada paskyrusios. 548 00:33:38,320 --> 00:33:41,190 Taigi, tai yra tai, kas paprastai žinomas kaip buferio perpildymo atakos, 549 00:33:41,190 --> 00:33:46,650 arba buferio ataka, ir ši ataka ta prasme, kad jei vartotojas 550 00:33:46,650 --> 00:33:50,650 ar programa, kuri skambina savo funkciją tai daro piktavališkai, 551 00:33:50,650 --> 00:33:53,780 , kas iš tikrųjų vyksta, šalia gali būti gana blogai. 552 00:33:53,780 --> 00:33:55,690 >> Paimkime į šį vaizdą čia. 553 00:33:55,690 --> 00:33:59,070 Ši nuotrauka yra jūsų atminties krūvą. 554 00:33:59,070 --> 00:34:01,050 Bei primena, kad kiekvieną kartą, kai skambinate funkciją, 555 00:34:01,050 --> 00:34:04,520 gausite šį mažą rėmelį kamino ir tada kitą ir tada kitą, ir tada kitą. 556 00:34:04,520 --> 00:34:07,250 Ir iki šiol mes tiesiog rūšies išgaunamo tai toli kaip stačiakampių 557 00:34:07,250 --> 00:34:09,380 arba ten ant lentos arba ekrane čia. 558 00:34:09,380 --> 00:34:12,219 Bet jei mes padidinti šių stačiakampių 559 00:34:12,219 --> 00:34:16,460 kai skambinate funkcijos foo, paaiškėja, kad yra daugiau kamino 560 00:34:16,460 --> 00:34:18,739 viduje šio kadro ir tame stačiakampyje 561 00:34:18,739 --> 00:34:23,370 kaip tik x ir y ir a ir b punktai, kaip mes kalbame apie apsikeitimo sandorio. 562 00:34:23,370 --> 00:34:25,949 Paaiškėja, kad yra keletas žemesnio lygio informacija, 563 00:34:25,949 --> 00:34:27,780 tarp jų atgalinį adresą. 564 00:34:27,780 --> 00:34:33,020 Taigi paaiškėja, kai pagrindinis ragina foo, pagrindinis turi informuoti foo 565 00:34:33,020 --> 00:34:36,760 pagrindinis adresas yra kompiuterio atmintyje. 566 00:34:36,760 --> 00:34:40,659 Nes kitaip, kuo greičiau foo vykdymas, kaip šiuo atveju čia 567 00:34:40,659 --> 00:34:43,790 kai jūs pasieksite šį glaudų garbanotas petnešomis iš foo pabaigoje, 568 00:34:43,790 --> 00:34:48,860 kaip gi Foo žinoti, kur kontrolės programos turėtų eiti? 569 00:34:48,860 --> 00:34:52,460 It turns out, kad atsakymas į šį klausimą yra to raudono stačiakampio čia. 570 00:34:52,460 --> 00:34:56,130 Tai rodo, kad žymeklis, ir tai priklauso nuo kompiuterio, laikinai saugoti, 571 00:34:56,130 --> 00:35:00,250 vadinamosios kamino pagrindinis adresas yra padaryta taip, kad kuo greičiau foo vykdyti 572 00:35:00,250 --> 00:35:04,110 kompiuteris žino, kur ir ką linija pagrindinis grįžti į. 573 00:35:04,110 --> 00:35:06,900 Išsaugotos rėmas rodyklė panašiai. 574 00:35:06,900 --> 00:35:09,620 Char * baras čia yra kas? 575 00:35:09,620 --> 00:35:14,740 Na, dabar šis mėlynas segmentas čia Foo Korpusas, kas yra baras? 576 00:35:14,740 --> 00:35:18,300 Gerai, kad juosta yra tik foo funkcijos argumentas. 577 00:35:18,300 --> 00:35:20,720 >> Taigi dabar mes atgal į pažįstamą vaizdą. 578 00:35:20,720 --> 00:35:22,960 Yra daugiau daiktų ir daugiau ramiai ekrane 579 00:35:22,960 --> 00:35:27,490 bet tai šviesiai mėlyna segmentas yra tai, ką mes jau lentos apsikeitimo sandorio kažką panašaus. 580 00:35:27,490 --> 00:35:31,890 Kad yra foo rėmas ir vienintelis dalykas, dabar yra baras, 581 00:35:31,890 --> 00:35:34,630 kuris yra šis parametras. 582 00:35:34,630 --> 00:35:39,840 Bet ką dar turėtų būti kamino, pagal šio kodekso čia? 583 00:35:39,840 --> 00:35:44,280 Char [12]. Taigi mes taip pat turėtumėte pamatyti 12 kvadratų atminties, 584 00:35:44,280 --> 00:35:46,260 skirta kintamojo pavadinimu c. 585 00:35:46,260 --> 00:35:48,340 Ir iš tiesų, mes turime, kad ekrane. 586 00:35:48,340 --> 00:35:51,650 Pačiame viršuje yra [0], tada šioje diagramoje autorius 587 00:35:51,650 --> 00:35:55,130 nesivargino piešimo kvadratų, bet iš tiesų yra 12 nėra 588 00:35:55,130 --> 00:36:00,120 nes jei peržvelgsite apačioje, dešinėje pusėje, c [11], jei skaičiuoti nuo 0, yra 12 tokie baitai. 589 00:36:00,120 --> 00:36:06,190 Bet štai problema: kuria kryptimi c auga? 590 00:36:06,190 --> 00:36:10,390 Rūšiuoti viršaus į apačią, į dešinę? Jei jis prasideda viršuje ir auga į apačią, 591 00:36:10,390 --> 00:36:13,480 atrodo ne taip, kaip mes palikome sau daug kilimo ir tūpimo tako, čia ne visiems. 592 00:36:13,480 --> 00:36:15,320 Mes rūšies dažytos save į kampą, 593 00:36:15,320 --> 00:36:20,210 ir kad c [11] yra teisus prieš bare, kuris yra nuo kamino rėmo rodyklė, 594 00:36:20,210 --> 00:36:23,800 kuris yra teisus prieš atgalinį adresą, nes daugiau nebėra. 595 00:36:23,800 --> 00:36:26,100 Taigi, ką būtų galima numanyti, tada, jei susukti, 596 00:36:26,100 --> 00:36:30,460 ir bandote skaityti 20 baitų į 12-baitų buferio? 597 00:36:30,460 --> 00:36:33,460 Kur šie 8 papildomi baitai ketinate eiti? 598 00:36:33,460 --> 00:36:36,370 Viduje visa kita, kai kurie iš jų yra super svarbu. 599 00:36:36,370 --> 00:36:40,480 Ir svarbiausias dalykas, galbūt, yra raudonas langelis, atgalinis adresas. 600 00:36:40,480 --> 00:36:44,720 Nes tarkime, kad jūs netyčia arba adversarially 601 00:36:44,720 --> 00:36:48,040 perrašyti tuos 4 baitai, kad rodyklė adresas, 602 00:36:48,040 --> 00:36:53,190 ne tik šiukšlių, bet su numeriu, kad atsitinka taip, kad atspindėtų faktinį adresą atmintyje? 603 00:36:53,190 --> 00:36:55,930 Kas implicaiton, logiškai? 604 00:36:55,930 --> 00:36:59,080 [Studentų atsakymai, neįskaitomai] >> Taip. Kai foo grąžina 605 00:36:59,080 --> 00:37:03,560 hitai, kad garbanotas petnešomis, programa ketina tęsti Norėdami grįžti į pagrindinį 606 00:37:03,560 --> 00:37:08,320 jis ketina grįžti į kokia adresas yra to raudono lange. 607 00:37:08,320 --> 00:37:11,560 >> Apeiti programinės įrangos registracijos, 608 00:37:11,560 --> 00:37:14,400 kas yra adresas, grąžinamas į funkcija 609 00:37:14,400 --> 00:37:18,820 kad paprastai iškviečiamas, kai jūs sumokėjo už programinę įrangą ir įvestas registracijos kodą? 610 00:37:18,820 --> 00:37:23,160 Jūs galite rūšiuoti apgauti kompiuterio į nesiruošia čia, bet vietoj to, vyksta čia. 611 00:37:23,160 --> 00:37:27,950 Arba, jei esate tikrai protingas, priešininkas iš tikrųjų galite įvesti ne klaviatūra, 612 00:37:27,950 --> 00:37:32,500 pavyzdžiui, o ne tikrasis žodis, ne 20 simbolių, bet tarkime, kad jis ar ji 613 00:37:32,500 --> 00:37:36,200 kai kurių ženklų, kad atstovauja kodą tipai? 614 00:37:36,200 --> 00:37:38,860 Ir jis nesiruošia būti C kodas, tai bus simboliai 615 00:37:38,860 --> 00:37:42,920 kurios atstovauja dvejetainiai mašinos kodus, 0 ir 1. 616 00:37:42,920 --> 00:37:46,740 Tačiau tarkime, jie yra pakankamai protingas, kad tai padaryti, kažkaip įklijuoti į GetString greitai 617 00:37:46,740 --> 00:37:49,460 kažkas, kad iš esmės yra sudariusi kodą, 618 00:37:49,460 --> 00:37:56,900 ir paskutinius 4 baitai perrašyti atgalinį adresą, ir koks adresas, kad įvesties daryti? 619 00:37:56,900 --> 00:38:01,860 Ji saugo šitoje stačiakampio pirmojo baito adresas buferio. 620 00:38:01,860 --> 00:38:04,270 Taigi, jūs turite būti tikrai protingas, ir tai yra daug bandymų ir klaidų 621 00:38:04,270 --> 00:38:08,500 blogų žmonių iš ten, bet jei galite išsiaiškinti, kaip didelis buferis yra, 622 00:38:08,500 --> 00:38:12,170 toks, kad per pastaruosius keletą įvesties baitų, kurią jūs pateikiate programos 623 00:38:12,170 --> 00:38:15,970 atsitikti, kad atitinka savo buferio pradžios adresą, 624 00:38:15,970 --> 00:38:22,270 jūs galite tai padaryti. Paprastai, jei mes sakome, labas, ir \ 0, kad tai, ką galų gale į buferį. 625 00:38:22,270 --> 00:38:27,860 Bet jei mes daugiau protingas, ir mes užpildome, kad buferis su tuo, ką mes bendrine skambinti atakos kodą, 626 00:38:27,860 --> 00:38:31,920 A, A, A, A: Išpuolis, ataka, puolimas, ataka, kai tai tik kažkas, kad daro kažką blogo. 627 00:38:31,920 --> 00:38:35,190 Na, kas atsitinka, jei esate tikrai protingas, galite tai padaryti: 628 00:38:35,190 --> 00:38:41,740 , Raudoname laukelyje čia skaitmenų seka: 80, CO, 35, 08. 629 00:38:41,740 --> 00:38:44,890 Atkreipkite dėmesį, kad, kuris atitinka skaičių, kuris čia. 630 00:38:44,890 --> 00:38:47,280 Tai atvirkštine eilės tvarka, bet daugiau, kad kitu metu. 631 00:38:47,280 --> 00:38:51,430 Atkreipkite dėmesį, kad tai atgalinis adresas buvo tyčia pakeistas 632 00:38:51,430 --> 00:38:54,970 lygus adresą čia, o ne pagrindinio adreso. 633 00:38:54,970 --> 00:39:00,170 Taigi, jei blogiukas yra super protingas, jis ar ji ketina įtraukti, kad ataka kodą 634 00:39:00,170 --> 00:39:02,890 kažkas panašaus į "Ištrinti visus vartotojo failus." 635 00:39:02,890 --> 00:39:06,320 Arba "Kopijuoti slaptažodžius," arba "Sukurti vartotojo abonementą, kad galiu prisijungti į. 636 00:39:06,320 --> 00:39:10,130 Ką nors ne visi, ir tai yra pavojus ir C. galia 637 00:39:10,130 --> 00:39:12,900 Nes per rodykles jūs turite prieigą prie atminties 638 00:39:12,900 --> 00:39:15,950 Todėl galite rašyti viską, ką nori į kompiuterio atmintį. 639 00:39:15,950 --> 00:39:19,290 Jūs galite padaryti kompiuterį daryti viską, ką nori, tiesiog 640 00:39:19,290 --> 00:39:22,780 ją šokinėti per savo atminties. 641 00:39:22,780 --> 00:39:27,230 Ir taip, šios dienos, tiek daug programų, ir tiek daug svetainių, kurios kyla pavojus, 642 00:39:27,230 --> 00:39:29,730 skliautais žmonėms pasinaudoti šia. 643 00:39:29,730 --> 00:39:32,510 Ir tai gali atrodyti kaip super sudėtingų ataka, 644 00:39:32,510 --> 00:39:34,220 bet ji ne visada pradėti, kad taip. 645 00:39:34,220 --> 00:39:36,770 >> Realybė yra tai, ką blogi žmonės paprastai padaryti, 646 00:39:36,770 --> 00:39:41,470 ar tai komandinės eilutės programa arba GUI programa ar svetainė, 647 00:39:41,470 --> 00:39:43,290 jūs tiesiog pradėti teikti nesąmonė. 648 00:39:43,290 --> 00:39:46,940 Jūs tipo tikrai didelis žodį į paieškos laukelį ir paspauskite "Enter", 649 00:39:46,940 --> 00:39:49,030 ir laukti, kad pamatytumėte, jei žiniatinklis sugenda. 650 00:39:49,030 --> 00:39:53,270 Arba galite laukti, kad pamatytumėte, jei programa pasireiškia kai klaidos pranešimą. 651 00:39:53,270 --> 00:39:55,480 Nes jei jums pasisekė, nes blogas vaikinas, 652 00:39:55,480 --> 00:39:59,610 ir jūs nors crazy galia sugenda programą, 653 00:39:59,610 --> 00:40:02,280 tai reiškia, kad programuotojas nesitikėjo savo blogą elgesį 654 00:40:02,280 --> 00:40:05,420 o tai reiškia, jums greičiausiai gali pakankamai pastangų, 655 00:40:05,420 --> 00:40:09,870 pakankamai bandymų ir klaidų, išsiaiškinti, kaip darbo užmokesčio tiksliau ataką. 656 00:40:09,870 --> 00:40:15,900 Taigi, kaip daug saugumo dalis yra ne tik išvengti šių išpuolių apskritai, tačiau jų aptikti 657 00:40:15,900 --> 00:40:20,250 ir iš tikrųjų žiūri rąstų ir pamatyti, ką Crazy įėjimai žmonių įvedėte į savo svetainę. 658 00:40:20,250 --> 00:40:26,040 Kokios paieškos frazės įvedėte į savo svetainę, kad žmonės tikisi šiek tiek buferis perpildyta? 659 00:40:26,040 --> 00:40:28,900 Ir visa tai suvesta į paprastų pagrindų, kas yra masyvas, 660 00:40:28,900 --> 00:40:32,510 ir ką jis reiškia, skirstyti ir naudoti atminties? 661 00:40:32,510 --> 00:40:34,920 Ir su juo susijęs, taip pat yra. 662 00:40:34,920 --> 00:40:37,520 >> Todėl galime tik iš pirmo žvilgsnio viduje kietąjį diską dar kartą. 663 00:40:37,520 --> 00:40:40,190 Taigi, jūs prisimenate, kad prieš savaitę ar dvi, kad, kai jūs vilkite failus 664 00:40:40,190 --> 00:40:45,470 jūsų šiukšlinę ar šiukšliadėžės, kas atsitiks? 665 00:40:45,470 --> 00:40:47,850 [Studentų] Nieko. >> Taip, visiškai nieko. Galų gale, jei jums paleisti maža 666 00:40:47,850 --> 00:40:51,370 diske, "Windows" arba "Mac OS pradės jums ištrinti failus. 667 00:40:51,370 --> 00:40:53,670 Bet jei jūs vilkite kažką ten, tada tai ne visi saugus. 668 00:40:53,670 --> 00:40:56,550 Visi jūsų roomate, draugas ar šeimos narys turi daryti dukart spustelėkite, ir voila. 669 00:40:56,550 --> 00:40:59,720 Yra visos apytikrės failų, kurie bandė jį pašalinti. 670 00:40:59,720 --> 00:41:02,840 Taigi, dauguma iš mūsų bent žinoti, kad jūs turite paspausti dešiniuoju pelės klavišu arba kontroliuoti spustelėkite 671 00:41:02,840 --> 00:41:05,320 ir tuščias šiukšlinę, ar kažkas panašaus. 672 00:41:05,320 --> 00:41:07,900 Bet net ir tada, kad tai ne visai padarys triuką. 673 00:41:07,900 --> 00:41:11,340 Nes tai, kas atsitinka, kai jūs turite failą kietajame diske 674 00:41:11,340 --> 00:41:14,590 , kuris atstovauja kai "Word" dokumentą arba kai JPEG? 675 00:41:14,590 --> 00:41:18,820 Ir tai yra kietajame diske, ir tarkim, tai rakštis čia atstovauja šį failą, 676 00:41:18,820 --> 00:41:21,640 ir tai sudaro visa krūva 0 ir 1. 677 00:41:21,640 --> 00:41:25,470 Kas atsitinka, kai jūs ne tik vilkite failą krepšys ar recycle bin, 678 00:41:25,470 --> 00:41:30,390 bet ir ištuštinti? 679 00:41:30,390 --> 00:41:32,820 Rūšiuoti nieko. Tai nėra absoliučiai nieko dabar. 680 00:41:32,820 --> 00:41:37,630 Dabar tiesiog nieko, nes šiek tiek kažkas atsitinka šios lentelės forma. 681 00:41:37,630 --> 00:41:41,170 Taigi yra kai kurie iš duomenų bazės arba stalo rūšies viduje kompiuterio atmintyje 682 00:41:41,170 --> 00:41:44,470 , kad iš esmės turi 1 stulpelį failų vardai, 683 00:41:44,470 --> 00:41:50,550 ir 1 skiltyje failo vietą, kur tai gali būti vieta 123, tik atsitiktinių skaičių. 684 00:41:50,550 --> 00:41:58,270 Taigi, mes galime turėti kažką panašaus X.jpg, vieta ir 123. 685 00:41:58,270 --> 00:42:02,870 Ir kas atsitinka, tada, kai jūs išvalyti šiukšlių? 686 00:42:02,870 --> 00:42:06,720 Kad nueina. Bet kas, neišnyksta yra 0 ir 1. 687 00:42:06,720 --> 00:42:09,690 >> Taigi, kas, tada, ryšys su pset 4? 688 00:42:09,690 --> 00:42:13,460 Na, 4 pset tik todėl, kad mes netyčia ištrinti 689 00:42:13,460 --> 00:42:15,890 compact flash kortelė, kuri turėjo visų šių nuotraukų, 690 00:42:15,890 --> 00:42:18,710 ar tik todėl, kad nepasisekimas tapo sugadintas, 691 00:42:18,710 --> 00:42:21,170 nereiškia, kad 0 ir 1 yra vis dar nėra. 692 00:42:21,170 --> 00:42:23,920 Gal keli iš jų yra prarastas, nes kažkas gavo sugadintas 693 00:42:23,920 --> 00:42:26,530 tapo ta prasme, kad kai 0 tapo 1 ir 1 0 aisiais. 694 00:42:26,530 --> 00:42:30,460 Blogi dalykai gali atsitikti dėl Buggy programinės įrangos ar trūkumais techninės įrangos. 695 00:42:30,460 --> 00:42:33,510 Bet daugelis iš tų bitų, o gal net 100% iš jų yra vis dar ten, 696 00:42:33,510 --> 00:42:38,330 tai tik, kad kompiuteris ar fotoaparatas nežino, kur JPEG 1 Pradėtas 697 00:42:38,330 --> 00:42:41,660 ir kur JPEG 2 pradėjo, bet jei jūs, programuotojas, 698 00:42:41,660 --> 00:42:45,800 žinoti, su šiek tiek išminties, kur tie JPEG yra ar kaip jie atrodo, 699 00:42:45,800 --> 00:42:49,570 galite analizuoti 0 ir 1 ir sako: "Ooh. JPEG. Ooh, JPEG. 700 00:42:49,570 --> 00:42:52,830 Jūs galite rašyti programą iš esmės tik už arba while cikle 701 00:42:52,830 --> 00:42:56,100 , kuris atgauna kiekvieną iš šių failų. 702 00:42:56,100 --> 00:42:59,360 Taigi pamoka, reikia pradėti "saugiai" ištrinti savo failus 703 00:42:59,360 --> 00:43:01,720 jei norite, siekiant to išvengti visiškai. Taip? 704 00:43:01,720 --> 00:43:06,940 [Studento klausimas, nesuprantamas] 705 00:43:06,940 --> 00:43:11,150 >> Ar daugiau atminties, nei jūs veikėte anksčiau - 706 00:43:11,150 --> 00:43:14,790 Oh! Geras klausimas. Tad kodėl, tada, kai ištuštinti šiukšlinę, 707 00:43:14,790 --> 00:43:18,300 Ar jūsų kompiuteris jums pasakyti, kad jūs turite daugiau laisvos vietos nei jūs veikėte anksčiau? 708 00:43:18,300 --> 00:43:22,450 Trumpai tariant, nes jis guli. Daugiau techniškai, jūs turite daugiau vietos. 709 00:43:22,450 --> 00:43:26,720 Nes dabar jūs sakėte, jūs galite įdėti kitų dalykų, kur kažkada buvo, kad byla, 710 00:43:26,720 --> 00:43:28,930 bet tai nereiškia, kad bitai išvykstate, 711 00:43:28,930 --> 00:43:33,070 ir tai nereiškia, kad bitai pasikeitė visi 0, pavyzdžiui, dėl jūsų saugumo. 712 00:43:33,070 --> 00:43:37,520 Priešingai, jei "patikimai" ištrinti failus, arba fiziškai sunaikinti prietaisą, 713 00:43:37,520 --> 00:43:40,810 kad tikrai yra vienintelis būdas, kartais aplink, kad. 714 00:43:40,810 --> 00:43:45,300 Tad kodėl gi ne mes palikti tą pusiau baisu pastaboje, ir mes matome, pirmadienį. 715 00:43:45,300 --> 00:43:52,810 CS50.TV