1 00:00:00,000 --> 00:00:02,860 [Powered by Google Translate] [Savaitė 5] 2 00:00:02,860 --> 00:00:04,860 [David J. Malan - Harvardo universiteto] 3 00:00:04,860 --> 00:00:07,260 [Tai CS50. - CS50.TV] 4 00:00:07,260 --> 00:00:09,740 >> Tai CS50, Savaitė 5. 5 00:00:09,740 --> 00:00:12,900 Šiandien ir šią savaitę, mes pristatome šiek tiek ekspertizės pasaulyje 6 00:00:12,900 --> 00:00:14,850 problemos kontekste rinkinys 4. 7 00:00:14,850 --> 00:00:18,480 Šiandien bus sutrumpintai paskaita, nes ten yra ypatingas įvykis čia vėliau. 8 00:00:18,480 --> 00:00:21,940 Taigi, mes priimsime žvilgtelėti ir erzinti tiek mokiniai bei jų tvai panašūs šiandien 9 00:00:21,940 --> 00:00:24,600 kai kurių dalykų, kurie, dėl horizonto. 10 00:00:24,600 --> 00:00:29,050 >> Tarp jų, kaip nuo pirmadienio, jūs turite keletą klasiokų. 11 00:00:29,050 --> 00:00:32,980 EDX, Harvardo ir MIT nauja internetinė iniciatyva OpenCourseWare ir daugiau, 12 00:00:32,980 --> 00:00:36,730 pradeda Harvardo universiteto miesteliu pirmadienį, o tai reiškia ateiti pirmadienis 13 00:00:36,730 --> 00:00:40,930 jums reikės, kaip ir praėjusiais skaičius, 86.000 papildomų klasiokai 14 00:00:40,930 --> 00:00:43,680 , kurie bus kartu su CS50 paskaitų ir skirsnius 15 00:00:43,680 --> 00:00:45,890 ir Walkthroughs ir problemų rinkiniai. 16 00:00:45,890 --> 00:00:51,870 Ir pagal šią programą, jūs tapsite CS50 ir dabar CS50x steigiamajame klasės nariais. 17 00:00:51,870 --> 00:00:56,150 Pagal šią programą dabar, suprantame, kad ten bus kai upsides taip pat. 18 00:00:56,150 --> 00:01:00,620 Pasiruošti už tai, dėl didelio studentų skaičiaus, 19 00:01:00,620 --> 00:01:03,820 pakanka pasakyti, kad nors mes turime 108 TFS ir CAS, 20 00:01:03,820 --> 00:01:07,560 tai ne visai geriausių studentų ir mokytojų santykis, kai mes Hit 80.000 studentų. 21 00:01:07,560 --> 00:01:09,830 Mes neketiname būti klasifikavimo tiek daug problema nustato rankiniu būdu, 22 00:01:09,830 --> 00:01:13,050 taip pristatė šią savaitę problemą, bus CS50 Registracijos 23 00:01:13,050 --> 00:01:15,410 kuri ketina per prietaiso komandų eilutės įrankis 24 00:01:15,410 --> 00:01:17,880 kad jūs gaunate, kai jūs ją atnaujinti vėliau šį savaitgalį. 25 00:01:17,880 --> 00:01:21,030 Galėsite paleisti komandą, check50, į savo pset 26 00:01:21,030 --> 00:01:24,770 ir gausite trumpąją grįžtamąjį ryšį, ar programa yra teisingas, ar neteisingas 27 00:01:24,770 --> 00:01:27,980 pagal įvairaus dizaino specifikacijas, kad mes teikiame. 28 00:01:27,980 --> 00:01:30,310 Daugiau apie šią problemą, specifikaciją. 29 00:01:30,310 --> 00:01:34,220 Bus naudojamas CS50x klasiokai tai taip pat. 30 00:01:34,220 --> 00:01:36,170 >> Problema rinkinys 4 yra visa informacija apie ekspertizės, 31 00:01:36,170 --> 00:01:38,630 ir šis pset buvo tikrai įkvėpė kai kurių realaus gyvenimo dalykų 32 00:01:38,630 --> 00:01:41,210 , pagal kurią, kai man buvo aukštosios mokyklos aš internuoti tam tikrą laiką 33 00:01:41,210 --> 00:01:45,270 Middlesex County apygardos prokuratūra daro ekspertizės darbą 34 00:01:45,270 --> 00:01:47,660 jų švino kriminalistikos tyrėjas. 35 00:01:47,660 --> 00:01:50,280 Ką tai sudarė, nes manau, minėjau kelias savaites po 36 00:01:50,280 --> 00:01:52,720 yra masė valstybinės policijos ar kiti ateis, 37 00:01:52,720 --> 00:01:56,150 jie užsnūsti standžiųjų diskų ir kompaktinių diskų ir diskelių ir panašių dalykų, pavyzdžiui, 38 00:01:56,150 --> 00:01:58,770 , o po to teismo ekspertizės biure tikslas buvo išsiaiškinti 39 00:01:58,770 --> 00:02:01,470 ar ten buvo ar nebuvo įrodymų, kad tam tikros rūšies. 40 00:02:01,470 --> 00:02:04,730 Tai buvo Specialiųjų tyrimų skyrius, todėl buvo baltos apykaklės nusikalstamumu. 41 00:02:04,730 --> 00:02:10,949 Tai buvo daugiau rūpesčių rūšies nusikaltimus, nieko įtraukiant kažkokį skaitmeninės žiniasklaidos. 42 00:02:10,949 --> 00:02:16,450 Pasirodo, kad ne, kad daugelis žmonių parašyti laišką, kuriame rašoma: "Aš tai padariau." 43 00:02:16,450 --> 00:02:20,490 Taigi, gana dažnai, šie kriminalistikos ieško ne riesti visi, kad daug vaisių, 44 00:02:20,490 --> 00:02:22,820 bet kartais žmonės rašyti tokius pranešimus. 45 00:02:22,820 --> 00:02:25,240 Todėl kartais, pastangos buvo apdovanoti. 46 00:02:25,240 --> 00:02:31,210 >> Bet vadovauti šio teismo ekspertizės pset mes nustatyti pset4 šiek tiek grafikos. 47 00:02:31,210 --> 00:02:35,410 Jūs tikriausiai atsižvelgti į šiuos dalykus suprantamas - JPEG, GIF ir panašūs dirbiniai: - šių dienų. 48 00:02:35,410 --> 00:02:38,320 Bet jei jūs tikrai manote apie tai, vaizdas, panašiai kaip Rob veidą, 49 00:02:38,320 --> 00:02:41,270 galėtų būti sukurtas kaip taškų seka arba taškais. 50 00:02:41,270 --> 00:02:43,380 Rob veidą, yra įvairiausių spalvų, 51 00:02:43,380 --> 00:02:46,760 ir mes pradėjome matyti atskirus taškus, kitaip žinoma kaip taškų, 52 00:02:46,760 --> 00:02:48,610 Kai mes pradėjome, norėdami ją padidinti. 53 00:02:48,610 --> 00:02:54,660 Bet jei mes supaprastinti pasaulį šiek tiek ir tiesiog pasakyti, kad tai čia is Rob juodos ir baltos spalvos, 54 00:02:54,660 --> 00:02:57,490 atstovauti juoda ir balta, mes galime tiesiog naudokite dvejetainis. 55 00:02:57,490 --> 00:03:01,660 Ir jei mes ketiname naudoti dvejetainis, 1 arba 0, mes galime išreikšti tą patį vaizdą 56 00:03:01,660 --> 00:03:06,140 Rob besišypsantį veidą su šiuo bitų modelis. 57 00:03:06,140 --> 00:03:12,100 11000011 atstovauja balta, balta, juoda, juoda, juoda, juoda, balta, balta. 58 00:03:12,100 --> 00:03:16,150 Ir todėl didžiulis šuolis pradėti kalbėti apie spalvingų fotografijų, 59 00:03:16,150 --> 00:03:18,600 dalykų, kad jūs norite pamatyti "Facebook" arba pasiimti su skaitmeninio fotoaparato. 60 00:03:18,600 --> 00:03:21,410 Bet tikrai, kai kalbama apie spalvų, jums reikia daugiau bitų. 61 00:03:21,410 --> 00:03:25,690 Ir gana paplitusi fotografijų pasaulyje yra naudoti ne 1-bitų spalvos, 62 00:03:25,690 --> 00:03:29,560 , nes tai rodo, bet 24-bitų spalvos, kur jūs iš tikrųjų gauti milijonus spalvų. 63 00:03:29,560 --> 00:03:32,250 Taigi, tuo atveju, kai mes Mastelis Rob akis, 64 00:03:32,250 --> 00:03:36,370 , kuris buvo bet milijonų skirtingų spalvinga galimybių. 65 00:03:36,370 --> 00:03:39,040 Taigi, mes jums pristatyti šią problemą, 4, taip pat į rankos 66 00:03:39,040 --> 00:03:43,370 kuri bus šiandien 03:30 vietoj įprastos 2:30 dėl penktadienio paskaitos čia. 67 00:03:43,370 --> 00:03:46,620 Bet vaizdo įrašas bus internete, kaip įprasta, rytoj. 68 00:03:46,620 --> 00:03:48,820 >> Mes taip pat supažindinti jus į kitą failo formatą. 69 00:03:48,820 --> 00:03:51,270 Tai sąmoningai siekiama atrodyti bauginanti iš pirmo, 70 00:03:51,270 --> 00:03:55,670 bet tai tik kai C struct dokumentacija. 71 00:03:55,670 --> 00:03:58,940 Pasirodo, kad "Microsoft" metų padėjo populiarinti šį formatą 72 00:03:58,940 --> 00:04:05,150 vadinamas bitmap failo formatas, BMP, ir tai buvo super paprastas, spalvingas grafinę failo formatas 73 00:04:05,150 --> 00:04:10,150 , kuris buvo naudojamas gana ilgą laiką ir kartais vis dar tapetai ant darbo stalų. 74 00:04:10,150 --> 00:04:14,760 Jei manote, kad atgal į Windows XP ir kalvomis ir mėlynas dangus, 75 00:04:14,760 --> 00:04:17,170 kad buvo paprastai bmp arba Bitmap Image. 76 00:04:17,170 --> 00:04:19,959 Rastrai yra įdomus mums, nes jie turi šiek tiek daugiau sudėtingumą. 77 00:04:19,959 --> 00:04:22,610 Tai ne visai taip paprasta, kaip šis tinklelis 0s ir 1s. 78 00:04:22,610 --> 00:04:27,510 Vietoj to, turite dalykų, pavyzdžiui, ne antraštės failo pradžioje. 79 00:04:27,510 --> 00:04:31,990 Taigi, kitaip tariant, viduje. Bmp failą yra visa krūva 0s ir 1s, 80 00:04:31,990 --> 00:04:34,910 bet yra ten keletas papildomų 0s ir 1s. 81 00:04:34,910 --> 00:04:38,220 Ir paaiškėja, kad tai, ką mes tikriausiai savaime suprantamu dalyku už metus - 82 00:04:38,220 --> 00:04:45,170 failų formatus, pavyzdžiui, doc arba. xls arba. mp3, mp4, nepriklausomai nuo failų formatai 83 00:04:45,170 --> 00:04:48,480 , kad esate susipažinę su ką tai net reiškia būti failo formatas, 84 00:04:48,480 --> 00:04:52,480 nes dienos pabaigoje visi iš šių failų, mes naudojame tik 0s ir 1s. 85 00:04:52,480 --> 00:04:56,810 O gal 0s ir 1s atstovauti ABC per ASCII arba panašių dirbinių, 86 00:04:56,810 --> 00:04:58,820 bet dienos pabaigoje, jis vis dar tik 0s ir 1s. 87 00:04:58,820 --> 00:05:02,100 Todėl žmonės tiesiog kartais nusprendžia sukurti naują failo formatą 88 00:05:02,100 --> 00:05:06,420 kur jie standartizuoti bitų modeliai bus iš tikrųjų reiškia. 89 00:05:06,420 --> 00:05:09,220 Ir šiuo atveju čia, žmonės, kurie sukūrė bitmap failo formatą 90 00:05:09,220 --> 00:05:15,620 rastrinio formato failą labai iš pirmo baito sakė, kad, kaip pažymėta kompensacijų 0 Nėra 91 00:05:15,620 --> 00:05:18,940 ten bus kai cryptically pavadintas kintamasis vadinamas bfType 92 00:05:18,940 --> 00:05:23,080 , kuris tiesiog reiškia bitmap failo tipą, ką bitmap failo tipas tai. 93 00:05:23,080 --> 00:05:27,700 Galite daryti išvadą, galbūt iš antroje eilėje, kad kompensuoti 2, baitų skaičius "2", 94 00:05:27,700 --> 00:05:33,740 turi 0s ir 1s modelį, kuris atitinka tai, ką? Ko nors dydis. 95 00:05:33,740 --> 00:05:35,310 Ir jis eina iš ten. 96 00:05:35,310 --> 00:05:37,410 4 problemą, jums bus vaikščioti per kai kurias iš šių dalykų. 97 00:05:37,410 --> 00:05:39,520 Mes nebus baigti rūpintis apie juos visus. 98 00:05:39,520 --> 00:05:47,510 Bet pastebėsite, kad jis pradeda gauti įdomus aplink baito 54: rgbtBlue, žalia, raudona. 99 00:05:47,510 --> 00:05:52,110 Jei jūs kada nors girdėjote akronimas RGB - raudona, žalia, mėlyna - tai yra nuoroda, kad 100 00:05:52,110 --> 00:05:54,610 nes paaiškėja, jūs galite dažyti visas vaivorykštės spalvas 101 00:05:54,610 --> 00:05:58,180 su šiek tiek raudonos ir mėlynos ir žalios spalvos derinys. 102 00:05:58,180 --> 00:06:03,320 Ir iš tiesų, tėvų kambaryje gali priminti kai iš pirmųjų projektorių. 103 00:06:03,320 --> 00:06:05,890 Šių dienų, jūs tiesiog pamatyti viena ryški šviesa išeina iš lęšio, 104 00:06:05,890 --> 00:06:09,800 bet atgal į tą dieną, kai turėjo raudoną objektyvas, mėlyną objektyvas, ir Green lens, 105 00:06:09,800 --> 00:06:13,380 ir jie kartu siekiama ekrane ir sudarė spalvingą vaizdą. 106 00:06:13,380 --> 00:06:16,270 Ir gana dažnai, vidurinės mokyklos ir gimnazijos tuos lęšius 107 00:06:16,270 --> 00:06:19,720 vis tiek šiek tiek Marley, todėl jūs tarsi matyti dviejų ir trijų vaizdų. 108 00:06:19,720 --> 00:06:24,100 Bet tai buvo idėja. Jūs turėjote raudona ir žalia ir mėlyna šviesa, tapyba nuotrauką. 109 00:06:24,100 --> 00:06:26,590 Ir tas pats principas naudojamas kompiuteriuose. 110 00:06:26,590 --> 00:06:30,230 >> Taigi tarp iššūkių, tada jums problema bus keletas dalykų rinkinys 4. 111 00:06:30,230 --> 00:06:34,800 Vienas iš jų yra iš tikrųjų dydį vaizdą, 0s ir 1s modelio 112 00:06:34,800 --> 00:06:40,200 išsiaiškinti, kuris gabaliukus 0s ir 1s atstovauti konstrukcija, kaip ir tai, 113 00:06:40,200 --> 00:06:43,630 ir tada išsiaiškinti, kaip atkartoti pikselių - REDs, bliuzo, Žalieji - 114 00:06:43,630 --> 00:06:46,660 viduje, todėl, kad, kai vaizdas atrodo taip iš pradžių, 115 00:06:46,660 --> 00:06:49,210 ji gali atrodyti taip, o ne po to. 116 00:06:49,210 --> 00:06:53,640 Tarp kitų iššūkių bus, kad jums bus įteiktas teismo ekspertizės vaizdą 117 00:06:53,640 --> 00:06:56,030 faktinės bylos iš skaitmeninės kameros. 118 00:06:56,030 --> 00:06:58,960 Ir kad kamera once upon a time, buvo visa krūva nuotraukų. 119 00:06:58,960 --> 00:07:03,760 Problema yra, mes netyčia ištrinti arba buvo sugadinta kažkaip vaizdas. 120 00:07:03,760 --> 00:07:05,750 Blogi dalykai nutinka su skaitmeninėmis kameromis. 121 00:07:05,750 --> 00:07:09,150 Ir todėl mes greitai nukopijuoti visus 0s ir 1s off tos kortelės už jus, 122 00:07:09,150 --> 00:07:13,610 išgelbėti juos visus į vieną didelį failą, o tada mes jums perduoti juos jums problema rinkinys 4 123 00:07:13,610 --> 00:07:19,320 , kad būtų galima rašyti C programą, su kuria susigrąžina visą šių JPEG, idealiai. 124 00:07:19,320 --> 00:07:23,330 Ir paaiškėja, kad JPEG, nors jie šiek tiek sudėtingos failo formatas - 125 00:07:23,330 --> 00:07:26,360 jie yra daug sudėtingesnis nei šis besišypsantis veidas čia - 126 00:07:26,360 --> 00:07:31,160 it turns out, kad kiekvienas JPEG prasideda nuo tų pačių modelių 0s ir 1s. 127 00:07:31,160 --> 00:07:35,630 , Galų gale, todėl naudojant while cikle arba linijos ar panašios, 128 00:07:35,630 --> 00:07:38,880 galite pakartoti per 0s ir 1s šiame teismo ekspertizės vaizdas, 129 00:07:38,880 --> 00:07:43,150 ir kiekvieną kartą, kai pamatysite specialų modelį, kuris apibrėžtas problemą, specifikaciją, 130 00:07:43,150 --> 00:07:47,880 galite manyti, čia yra su labai didele tikimybe, JPEG pradžia. 131 00:07:47,880 --> 00:07:51,230 Ir kuo greičiau rasti tą patį modelį, kiek baitų skaičių 132 00:07:51,230 --> 00:07:55,430 kilobaitų ar megabaitų vėliau, galite manyti, čia yra antras JPEG, 133 00:07:55,430 --> 00:07:57,380 nuotrauka aš paėmė po pirmosios. 134 00:07:57,380 --> 00:08:01,370 Leiskite man nustoti skaityti, kad pirmą failą, pradėkite rašyti šį naują, 135 00:08:01,370 --> 00:08:06,310 ir savo programą išėjimas pset4 bus ne daugiau kaip 50 JPEG. 136 00:08:06,310 --> 00:08:09,270 Ir jei tai ne 50 JPEG, turite šiek tiek kilpa. 137 00:08:09,270 --> 00:08:12,490 Jei turite begalinį skaičių JPEG, turite begalinis ciklas. 138 00:08:12,490 --> 00:08:14,910 Taip, kad taip pat bus gana dažnas atvejis. 139 00:08:14,910 --> 00:08:16,600 Todėl tai, kas dėl horizonto. 140 00:08:16,600 --> 00:08:21,310 >> 0 Viktorina už mus, supranta, kad per mano elektroninio pašto adresą, kad visada yra žmonės, kurie yra abu laimingi, 141 00:08:21,310 --> 00:08:23,640 tarsi neutralaus, ir liūdna, aplink viktorina 0 laiką. 142 00:08:23,640 --> 00:08:26,800 Ir prašome į mane, galva TF Zamyla, savo TF, 143 00:08:26,800 --> 00:08:31,180 CAS arba, kad jūs žinote, jei norite aptarti, kaip viskas vyko. 144 00:08:31,180 --> 00:08:35,539 >> Taigi įspūdį tėvams į kambarį, kas yra CS50 biblioteka? 145 00:08:36,429 --> 00:08:40,390 [Juokas] Geras darbas. 146 00:08:40,390 --> 00:08:48,340 Kas yra CS50 biblioteka? Taip. >> [Studentas] Tai iš anksto parašytų kodo rinkinys [nesigirdi] 147 00:08:48,340 --> 00:08:49,750 Gerai, gerai. 148 00:08:49,750 --> 00:08:53,240 Tai iš anksto parašytų kodo rinkinys, kad mes darbuotojai rašė, mes suteiksime jums, 149 00:08:53,240 --> 00:08:55,030 , kuri suteikia tam tikrų bendrų funkcijų, 150 00:08:55,030 --> 00:08:59,020 stuff like man eilutę, man int - visų funkcijų, kurios yra išvardyti čia. 151 00:08:59,020 --> 00:09:02,260 >> Nuo dabar, mes pradedame iš tiesų imtis šias mokymo ratus. 152 00:09:02,260 --> 00:09:05,050 Mes ketiname pradėti atimti iš jūsų eilutę, 153 00:09:05,050 --> 00:09:08,870 išėmimas iš apyvartos yra tik už tai, ką faktinis duomenų tipas sinonimas? >> [Keli studentai] char *. 154 00:09:08,870 --> 00:09:12,730 Char *. Tėvams, kad tikriausiai buvo [daro švilpesys garsas]. Tai gerai. 155 00:09:12,730 --> 00:09:17,550 Char * mes pradėsime matyti ekrane daugiau, kaip mes pašalinti eilutę iš mūsų žodyno, 156 00:09:17,550 --> 00:09:19,730 bent jau kai kalbama, kad iš tikrųjų rašyti kodą. 157 00:09:19,730 --> 00:09:22,840 Be to, mes sustabdysime naudojant kai kurias iš šių funkcijų, kiek 158 00:09:22,840 --> 00:09:25,280 , nes mūsų programos gauti daugiau sudėtingas. 159 00:09:25,280 --> 00:09:28,480 , O ne tik rašyti programas, kad sėdi ten su greitai mirksi, 160 00:09:28,480 --> 00:09:31,870 laukia, kad vartotojas galėtų įvesti kažką, jūs gausite savo sąnaudas iš kitur. 161 00:09:31,870 --> 00:09:35,490 Pavyzdžiui, jūs gausite juos iš bitų serijos dėl vietos standžiajame diske. 162 00:09:35,490 --> 00:09:38,580 Jūs, o ne gauti ateityje juos nuo tinklo ryšį, 163 00:09:38,580 --> 00:09:40,230 kai svetainė kažkur. 164 00:09:40,230 --> 00:09:44,110 >> Todėl galime žievelės atgal pirmą kartą šį sluoksnį ir atsigriebti CS50 Appliance 165 00:09:44,110 --> 00:09:49,010 ir šį failą, vadinamas cs50.h, jūs buvote # įskaitant savaites, 166 00:09:49,010 --> 00:09:51,140 bet tegul iš tikrųjų pamatyti, kas yra viduje. 167 00:09:51,140 --> 00:09:54,430 Mėlynai failo viršuje yra tiesiog visa krūva komentarų: 168 00:09:54,430 --> 00:09:57,050 Informacija apie garantiją ir licencijavimas. 169 00:09:57,050 --> 00:09:59,050 Tai yra tarsi bendros paradigmos programinės įrangos 170 00:09:59,050 --> 00:10:01,580 nes yra tai, kas vadinama atviro kodo programinės įrangos daug šių dienų, 171 00:10:01,580 --> 00:10:05,220 , o tai reiškia, kad kažkas parašė kodą ir jis laisvai 172 00:10:05,220 --> 00:10:10,470 ne tiesiog paleisti ir naudoti, bet iš tiesų perskaityti ir pakeisti ir integruoti į savo darbą. 173 00:10:10,470 --> 00:10:14,660 Todėl tai, ką jūs naudojate, atviro kodo programinę įrangą, nors ir labai maža. 174 00:10:14,660 --> 00:10:18,560 Jei aš slinkti žemyn praeityje komentarų, nors mes pradėsime pamatyti kai kuriuos žinomus dalykus. 175 00:10:18,560 --> 00:10:25,010 Pranešimas viršuje, kad cs50.h faile yra visa krūva header files. 176 00:10:25,010 --> 00:10:28,560 Dauguma iš jų, mes dar nematėte anksčiau, bet vienas yra susipažinęs. 177 00:10:28,560 --> 00:10:32,270 , Kuris iš jų mes matėme, nors ir trumpai, iki šiol? >> [Studentas] Standartinis biblioteka. 178 00:10:32,270 --> 00:10:35,810 Taip, standartinės bibliotekos. stdlib.h turi malloc. 179 00:10:35,810 --> 00:10:38,320 Kai mes pradėjome kalbėti apie dinaminio atminties paskirstymo, 180 00:10:38,320 --> 00:10:41,650 kuriuos mes grįžti kitą savaitę, taip pat, mes pradėjome įskaitant šio failo. 181 00:10:41,650 --> 00:10:46,640 Pasirodo, kad bool, true ir false ne iš tikrųjų egzistuoja C per se 182 00:10:46,640 --> 00:10:49,440 , jei norite įtraukti šį failą čia. 183 00:10:49,440 --> 00:10:52,710 Mes savaites įskaitant stdbool.h 184 00:10:52,710 --> 00:10:55,620 taip, kad jūs galite naudoti bool, true arba false. sąvoką 185 00:10:55,620 --> 00:10:58,620 Be to, jums reikės rūšiuoti Fake It ir naudoti int 186 00:10:58,620 --> 00:11:02,610 ir tiesiog savavališkai manyti, kad 0 yra klaidingas ir 1 yra tiesa. 187 00:11:02,610 --> 00:11:07,150 Jei mes slinkti žemyn toliau, čia yra mūsų apibrėžimas eilutę. 188 00:11:07,150 --> 00:11:11,390 It turns out, kaip mes minėta anksčiau,, kad tais atvejais, kai ši žvaigždė yra tikrai ne klausimas. 189 00:11:11,390 --> 00:11:13,720 Jūs netgi galite turėti erdvę, visi aplink. 190 00:11:13,720 --> 00:11:16,740 Mes šį semestrą buvo skatinti, nes tai, kad būtų aišku, 191 00:11:16,740 --> 00:11:18,620 kad žvaigždė turi daryti su tipo, 192 00:11:18,620 --> 00:11:21,700 bet suprantame, toks dažnas reiškinys, jei ne šiek tiek labiau paplitęs, 193 00:11:21,700 --> 00:11:24,430 padėkite jį ten, bet funkciniu požiūriu tai tas pats dalykas. 194 00:11:24,430 --> 00:11:27,720 Bet dabar, jei mes skaitome toliau, tegul už GetInt išvaizdą 195 00:11:27,720 --> 00:11:32,190 nes mes naudojamas, kad galbūt pirma prieš ką nors šį semestrą. 196 00:11:32,190 --> 00:11:37,440 Čia yra GetInt. Tai, ką? >> [Studentas] prototipas. >> Tai tik prototipas. 197 00:11:37,440 --> 00:11:41,410 Dažnai mes turime įdėti prototipų ne mūsų viršūnes c failai, 198 00:11:41,410 --> 00:11:46,690 bet taip pat galite įdėti prototipų header files, h failus, patiko šį vieną čia 199 00:11:46,690 --> 00:11:50,840 taip, kad, kai rašote kai kurias funkcijas, kad jūs norite, kad kiti žmonės galėtų naudotis, 200 00:11:50,840 --> 00:11:53,550 kuris yra tiksliai su CS50 bibliotekos atvejis, 201 00:11:53,550 --> 00:11:57,040 jūs ne tik įgyvendinti savo funkcijas kažką panašaus cs50.c 202 00:11:57,040 --> 00:12:02,790 jūs taip pat įdėti prototipų ne dėl šios bylos viršuje, bet antraštės failo viršuje. 203 00:12:02,790 --> 00:12:07,170 Tada, kad failo antraštės yra tai, ką draugai ir kolegos 204 00:12:07,170 --> 00:12:09,760 # include savo kodą. 205 00:12:09,760 --> 00:12:12,210 Taigi visą šį laiką buvote įskaitant visus iš šių prototipų, 206 00:12:12,210 --> 00:12:16,580 veiksmingai failo viršuje, bet kaip tai # include mechanizmą, 207 00:12:16,580 --> 00:12:20,070 iš esmės kopijos ir pastos šį failą į savo. 208 00:12:20,070 --> 00:12:23,070 Čia yra keletas gana išsamūs dokumentai. 209 00:12:23,070 --> 00:12:25,640 Mes beveik savaime suprantamu dalyku kad GetInt gauna int, 210 00:12:25,640 --> 00:12:27,640 tačiau paaiškėja, yra keletas kampiniai atvejai. 211 00:12:27,640 --> 00:12:31,810 Ką daryti, jei vartotojas įveda kelias pernelyg didelis skaičius, kad, quintillion 212 00:12:31,810 --> 00:12:35,490 kad tiesiog negali tilpti int? Koks numatomas elgesys? 213 00:12:35,490 --> 00:12:38,020 Idealiu atveju, tai yra nuspėjama. 214 00:12:38,020 --> 00:12:40,280 Taigi šiuo atveju, jei jūs iš tikrųjų skaityti baudos spausdinti, 215 00:12:40,280 --> 00:12:44,500 jūs iš tikrųjų matyti, kad jei linija negali būti perskaityti, tai grąžina INT_MAX. 216 00:12:44,500 --> 00:12:48,320 Mes niekada kalbėjo apie tai, bet remiantis jos kapitalizacijoje, kas tai yra tikriausiai? 217 00:12:48,320 --> 00:12:50,640 [Studentas] pastovus. >> Tai konstanta. 218 00:12:50,640 --> 00:12:54,770 Tai kai speciali konstanta, tikriausiai, viena iš tų header files 219 00:12:54,770 --> 00:13:00,090 tai iki didesnis failo ir INT_MAX yra turbūt kažkas kaip maždaug 2 mlrd. 220 00:13:00,090 --> 00:13:04,990 idėja yra ta, kad, nes mes turime kažkaip reiškia, kad kažkas negerai, 221 00:13:04,990 --> 00:13:10,700 mes, taip, 4 mlrd. numerius mūsų žinioje: -2 mlrd. iki 2 milijardų, suteikti arba užtrukti. 222 00:13:10,700 --> 00:13:14,710 Na, kas yra bendra programavimo jūs pavogti tik vieną iš šių numerių, 223 00:13:14,710 --> 00:13:18,920 gal 0, o gal 2 mlrd. -2 mlrd., o gal, 224 00:13:18,920 --> 00:13:23,280 taigi jūs prarandate vieną iš savo galimų reikšmių, kad būtų galima įsipareigoti pasaulyje 225 00:13:23,280 --> 00:13:26,820 , kad jei kas nors negerai, aš grįšiu šį super neįkainojamos vertės. 226 00:13:26,820 --> 00:13:31,030 Bet jūs neturite norite, kad vartotojas rašyti kažką neaiškūs kaip 234 ..., tikrai didelis skaičius. 227 00:13:31,030 --> 00:13:34,060 Jūs apibendrinti ją, o ne kaip konstanta. 228 00:13:34,060 --> 00:13:38,060 Ir tikrai, jei jums buvo analinis pastaruosius keletą savaičių, bet kada vadinamas GetInt 229 00:13:38,060 --> 00:13:42,900 jums turėjo tikrinti jei sąlyga vartotojo tipą INT_MAX 230 00:13:42,900 --> 00:13:46,590 arba, tiksliau, padarė GetInt grąžinimo INT_MAX, nes jei ji, 231 00:13:46,590 --> 00:13:51,830 tai iš tikrųjų reiškia, jie nebuvo įveskite jį. Kažkas negerai šioje byloje. 232 00:13:51,830 --> 00:13:56,080 Taigi, tai yra tai, kas paprastai žinomas kaip sarginio vertės, kuris tiesiog reiškia specialiuosius. 233 00:13:56,080 --> 00:13:58,120 >> Tegul dabar virsta c failas. 234 00:13:58,120 --> 00:14:01,340 C failas egzistuoja prietaiso tam tikrą laiką. 235 00:14:01,340 --> 00:14:06,840 Ir iš tikrųjų reiškia, kad prietaisas yra iš anksto surinkti už jus į tą daiktą, mes vadinami objekto kodas 236 00:14:06,840 --> 00:14:09,540 bet jis tiesiog nėra klausimas jums, kur jis yra, nes sistema žino 237 00:14:09,540 --> 00:14:11,730 šiuo atveju, kai ji yra: prietaisas. 238 00:14:11,730 --> 00:14:17,400 Leiskite slinkti žemyn dabar GetInt ir pamatyti, kaip GetInt dirbo visą šį laiką. 239 00:14:17,400 --> 00:14:19,460 Čia mes turime panašias pastabas anksčiau. 240 00:14:19,460 --> 00:14:21,660 Leiskite man priartinti tik kodo dalis. 241 00:14:21,660 --> 00:14:23,900 Ir tai, ką mes turime GetInt tokia. 242 00:14:23,900 --> 00:14:25,700 Ji nežino įvestį. 243 00:14:25,700 --> 00:14:29,510 Ji grąžina int, while (true), todėl mes turime sąmoningai begalinis ciklas, 244 00:14:29,510 --> 00:14:33,180 bet turbūt mes išeiti tai vienaip ar grįžti iš per šį laikotarpį. 245 00:14:33,180 --> 00:14:34,870 >> Pažiūrėkime, kaip tai veikia. 246 00:14:34,870 --> 00:14:39,240 Mes, atrodo, kad naudojant GetString šioje pirmoje eilutėje viduje linijos, 166. 247 00:14:39,240 --> 00:14:43,780 Šiuo metu tai yra gera praktika, nes, kokiomis aplinkybėmis gali grįžti GetString 248 00:14:43,780 --> 00:14:47,660 konkrečių raktinių žodžių NULL? >> [Studentas] Jei kas nors negerai. 249 00:14:47,660 --> 00:14:51,630 Jei kažkas negerai. Ir kas galėtų suklysti, kai skambinate kažką panašaus GetString? 250 00:14:54,960 --> 00:14:57,640 Taip. >> [Studentas] malloc nesugeba suteikti jai int. 251 00:14:57,640 --> 00:14:59,150 Taip. Gal malloc nepavyksta. 252 00:14:59,150 --> 00:15:03,190 Kažkur po kapotu, GetString skambina malloc, kuri paskirstoma atmintį, 253 00:15:03,190 --> 00:15:06,020 kuri leidžia kompiuterių parduotuvėje visus simbolius 254 00:15:06,020 --> 00:15:07,750 kad vartotojas įveda klaviatūra. 255 00:15:07,750 --> 00:15:11,590 Ir tarkime, vartotojas buvo visai daug laisvo laiko ir atspausdinti daugiau, pavyzdžiui, 256 00:15:11,590 --> 00:15:16,160 nei 2 mlrd. simbolių, daugiau simbolių, nei kompiuterio, net RAM. 257 00:15:16,160 --> 00:15:19,250 GetString turi būti galėtų reikšti, kad jums. 258 00:15:19,250 --> 00:15:22,560 Net jei tai super, super neįprasta kampe atveju, 259 00:15:22,560 --> 00:15:24,340 jis turi kažkaip būti galėtų dirbti, 260 00:15:24,340 --> 00:15:28,750 ir taip, jei mes grįžo ir perskaityti jo dokumentus, GetString daro tiesų grąžina NULL. 261 00:15:28,750 --> 00:15:34,460 Taigi dabar, jei GetString nepavyksta grąžinant NULL, GetInt vyksta žlugti grąžinant INT_MAX 262 00:15:34,460 --> 00:15:37,690 tik kaip Sentinel. Tai tik žmogaus konvencijas. 263 00:15:37,690 --> 00:15:41,450 Vienintelis būdas turėtumėte žinoti, šiuo atveju yra skaityti dokumentus. 264 00:15:41,450 --> 00:15:45,040 >> Leiskite slinkite žemyn, kur iš tikrųjų Dotarłeś int. 265 00:15:45,040 --> 00:15:51,160 Jei aš slinkti žemyn šiek tiek toliau, atitinka 170, mes turime virš šių eilučių komentarą. 266 00:15:51,160 --> 00:15:55,100 Mes pareiškiame, 172, int n, char, C, ir tada šios naujos funkcijos, 267 00:15:55,100 --> 00:15:58,930 kai kurios iš jūsų turite szarpnęły priešais prieš sscanf. 268 00:15:58,930 --> 00:16:00,870 Tai reiškia styginių scanf. 269 00:16:00,870 --> 00:16:05,700 Kitaip tariant, duok eilutę ir bus nuskaityti informacijos vienetų interesų. 270 00:16:05,700 --> 00:16:07,360 Ką tai reiškia? 271 00:16:07,360 --> 00:16:11,800 Tarkime, kad aš tipo, pažodžiui, 123 prie klaviatūros ir tada paspauskite Enter. 272 00:16:11,800 --> 00:16:16,470 Kas yra duomenų tipas 123 sugrįžę GetString? >> [Studentas] String. 273 00:16:16,470 --> 00:16:18,380 Tai akivaizdžiai eilutę, tiesa? Aš turiu eilutę. 274 00:16:18,380 --> 00:16:23,220 Taigi, 123 yra tikrai, citata citatos, 123, \ 0 "jo pabaigoje. 275 00:16:23,220 --> 00:16:27,110 Tai ne int. Kad ne skaičius. Atrodo, kad skaičius, bet iš tikrųjų tai ne. 276 00:16:27,110 --> 00:16:29,080 Taigi, ką GetInt daryti? 277 00:16:29,080 --> 00:16:35,750 Ji turi nuskaityti tą eilutę, iš kairės į dešinę - 123 \ 0 ir kažkaip konvertuoti į faktinį sveikojo skaičiaus. 278 00:16:35,750 --> 00:16:37,850 Jūs galite išsiaiškinti, kaip tai padaryti. 279 00:16:37,850 --> 00:16:41,450 Jei manote, kad atgal į pset2, jūs tikriausiai gavo šiek tiek patogiau su Cezario 280 00:16:41,450 --> 00:16:44,820 arba Vigenere, todėl galite pakartoti per eilutę, galite konvertuoti simbolių int. 281 00:16:44,820 --> 00:16:46,710 Bet gi, tai visai daug darbo. 282 00:16:46,710 --> 00:16:49,860 Kodėl gi ne skambinti kaip sscanf funkcija, kad visa tai už jus? 283 00:16:49,860 --> 00:16:54,230 Taigi sscanf tikisi argumentą - šiuo atveju vadinamas eilutė, kurioje yra eilutė. 284 00:16:54,230 --> 00:17:01,840 Jūs tada nurodykite į kabutes, labai panašus į printf, ką jūs tikitės pamatyti šios eilutės. 285 00:17:01,840 --> 00:17:09,000 O ką aš sakau čia aš tikėtis pamatyti dešimtainį skaičių, o gal ir charakterį. 286 00:17:09,000 --> 00:17:12,000 Ir mes pamatyti, kodėl tai yra vos akimirką. 287 00:17:12,000 --> 00:17:15,869 Ir paaiškėja, kad ši aiškinamoji pastaba yra dabar primena daiktų mes pradėjome kalbėti apie 288 00:17:15,869 --> 00:17:17,619 šiek tiek daugiau nei prieš savaitę. 289 00:17:17,619 --> 00:17:21,740 Kas yra ir nanotechnologijų ir c daro mums čia? >> [Studentas] n adresas ir adresas a. 290 00:17:21,740 --> 00:17:25,400 Taip. Tai, kad suteikėte man n ir adresas c adresą. Kodėl tai svarbu? 291 00:17:25,400 --> 00:17:30,220 Žinote, funkcijų C, jūs visada galite grįžti reikšmę arba jokios vertės. 292 00:17:30,220 --> 00:17:34,530 Galite grįžti Žiniasklaida, eilutę, apyvartinės lėšos, char, neatsižvelgiant, arba galite grįžti negaliojančiu, 293 00:17:34,530 --> 00:17:38,030 tačiau jūs galite tik grąžina vieną dalyką maksimaliai. 294 00:17:38,030 --> 00:17:42,760 Bet čia mes norime sscanf gal man grįžti Žiniasklaida, dešimtainis skaičius, 295 00:17:42,760 --> 00:17:46,220 ir taip pat char, ir aš paaiškinti, kodėl char per akimirką. 296 00:17:46,220 --> 00:17:51,460 Jums efektyviai norite sscanf grąžinti du dalykus, bet tai tiesiog neįmanoma C. 297 00:17:51,460 --> 00:17:55,200 Galite dirbti aplink, kad išlaikius dviem adresais 298 00:17:55,200 --> 00:17:57,370 nes kuo greičiau perduoti tam tikrą funkciją du adresus, 299 00:17:57,370 --> 00:18:00,470 ką gali, kad funkcija su jomis daryti? >> [Studentas] Parašyti šiais adresais. 300 00:18:00,470 --> 00:18:02,010 Gali rašyti šiais adresais. 301 00:18:02,010 --> 00:18:05,770 Galite naudoti žvaigždė operaciją, ir ten, į kiekvieną iš šių adresų. 302 00:18:05,770 --> 00:18:11,260 Tai tarsi šios atgal durų mechanizmas, tačiau labai dažnai keičiasi kintamųjų reikšmes 303 00:18:11,260 --> 00:18:14,870 daugiau nei vienoje vietoje - šiuo atveju, dvi. 304 00:18:14,870 --> 00:18:21,340 Dabar pastebėsite, aš tikrinti == 1 ir tada grįžti n jeigu tai, iš tiesų, įvertinti, tiesa. 305 00:18:21,340 --> 00:18:26,170 Taigi, kas vyksta? Techniškai, visi, mes tikrai norime, kad taip atsitiktų, GetInt tai. 306 00:18:26,170 --> 00:18:30,740 Mes norime apdoroti, taip sakant, mes norime skaityti eilutę - citata-123 Unquote 307 00:18:30,740 --> 00:18:34,560 ir jei atrodo, kad ten numeris yra tai, ką mes sakai sscanf tai padaryti 308 00:18:34,560 --> 00:18:38,190 įdėti šį skaičių - 123 - šis kintamasis n man. 309 00:18:38,190 --> 00:18:42,090 Tad kodėl tada aš iš tikrųjų turi tai, kaip gerai? 310 00:18:42,090 --> 00:18:48,220 Kas yra sscanf vaidmuo, kad jūs taip pat gali gauti simbolį? 311 00:18:48,220 --> 00:18:53,470 [Nesigirdi studentas atsakas] >> dešimtainis taškas iš tikrųjų galėtų dirbti. 312 00:18:53,470 --> 00:18:56,330 Leiskite nuspręsti, kad akimirką pagalvojo. Ką dar? 313 00:18:56,330 --> 00:18:59,270 [Studentas] Tai gali būti NULL. >> Gera mintis. Tai gali būti niekinis pobūdis. 314 00:18:59,270 --> 00:19:01,660 Tai tikrai ne šiuo atveju. Taip. >> [Studentas] ASCII. 315 00:19:01,660 --> 00:19:04,340 ASCII. Arba leiskite man apibendrinti dar labiau. 316 00:19:04,340 --> 00:19:06,640 % C yra tik klaidų tikrinimas. 317 00:19:06,640 --> 00:19:09,300 Mes nenorime būti po skaičiaus pobūdis, 318 00:19:09,300 --> 00:19:11,870 bet tai leidžia man padaryti tokia. 319 00:19:11,870 --> 00:19:18,210 Pasirodo, kad sscanf, be to, saugoti vertybes n ir c šiame pavyzdyje, 320 00:19:18,210 --> 00:19:24,890 ką jis taip pat tai grąžina kintamųjų skaičius įdėti vertybes in 321 00:19:24,890 --> 00:19:30,260 Taigi, jei turite tik įvesti 123, tada tik% d ketina suderinti, 322 00:19:30,260 --> 00:19:33,880 ir tik n pasireiškia saugomi kaip 123 vertės 323 00:19:33,880 --> 00:19:35,640 ir nieko bus įdėti į c. 324 00:19:35,640 --> 00:19:37,620 C išlieka šiukšlių vertė, taip sakant - 325 00:19:37,620 --> 00:19:40,730 šiukšlių, nes ji niekada nebuvo inicijuoti tam tikrą vertę. 326 00:19:40,730 --> 00:19:45,520 Taigi, tuo atveju, sscanf grąžina 1, nes aš apgyvendintos 1 šių rodykles, 327 00:19:45,520 --> 00:19:50,190 tokiu atveju puikus, turiu int, kad aš išlaisvinti liniją atlaisvinti atminties 328 00:19:50,190 --> 00:19:54,000 kad GetString faktiškai skirta, ir tada aš grįžti n, 329 00:19:54,000 --> 00:19:58,500 kitas, jei jūs kada nors susimąstėte, kur tas Retry pareiškimas nuskambėjo iš, ji ateina iš čia. 330 00:19:58,500 --> 00:20:04,390 Taigi, jei, priešingai, aš tipo 123foo tik keletas atsitiktinai teksto seka - 331 00:20:04,390 --> 00:20:08,490 sscanf vyksta pamatyti numerį, numeris, skaičius, f, 332 00:20:08,490 --> 00:20:16,410 ir tai vyksta įdėti N 123; jis ketina įdėti c F ir tada grįžti 2. 333 00:20:16,410 --> 00:20:20,640 Taigi, mes turime, tik naudojant pagrindinį apibrėžimą sscanf elgesį, labai paprastas būdas - 334 00:20:20,640 --> 00:20:23,900 gerai, sudėtinga iš pirmo žvilgsnio, bet dienos pabaigoje gana paprastas mechanizmas - 335 00:20:23,900 --> 00:20:28,320 sakyti, yra int, ir jei taip, tai, kad vienintelis dalykas, kad aš rasiu? 336 00:20:28,320 --> 00:20:29,860 Ir tarpus čia yra tyčinis. 337 00:20:29,860 --> 00:20:34,000 Jei jūs skaitote kad sscanf dokumentus, jis jums pasakys, kad jei yra tarpų gabalas 338 00:20:34,000 --> 00:20:38,810 pradžioje arba pabaigoje, sscanf per leis vartotojui, neatsižvelgiant į priežastis, 339 00:20:38,810 --> 00:20:41,860 tarpo klavišą, kad pasiektų 123 ir tai bus teisėta. 340 00:20:41,860 --> 00:20:44,150 Jūs ne klykauti ne tik todėl, kad jie paspauskite tarpo klavišą vartotojo 341 00:20:44,150 --> 00:20:48,640 pradžioje, arba pabaigoje, kuri yra tik šiek tiek patogesnis. 342 00:20:48,640 --> 00:20:52,300 >> Kokių nors klausimų ant GetInt? Taip. >> [Studentas] Ką daryti, jei jūs tiesiog įdėti į char? 343 00:20:52,300 --> 00:20:54,030 Geras klausimas. 344 00:20:54,030 --> 00:20:59,890 Ką daryti, jei jūs tiesiog atspausdinti kaip f char ir paspauskite "Enter" be galimybės kada nors rašyti 123? 345 00:20:59,890 --> 00:21:02,420 Ką manote elgesys šio kodo eilutę, tada būtų? 346 00:21:02,420 --> 00:21:04,730 [Nesigirdi studentas atsakas] 347 00:21:04,730 --> 00:21:08,790 Taip, kad sscanf gali apimti, kad per daug, nes tokiu atveju jis nesiruošia užpildyti N ar C. 348 00:21:08,790 --> 00:21:15,310 Ji ketina vietoj grįžti 0, tokiu atveju aš taip pat gaudyti kad scenarijus 349 00:21:15,310 --> 00:21:18,750 nes aš noriu yra laukiama vertė 1. 350 00:21:18,750 --> 00:21:22,000 Aš tik noriu vieną ir tik vienas dalykas turi būti užpildyti. Geras klausimas. 351 00:21:22,000 --> 00:21:24,290 >> Kiti? Gerai. 352 00:21:24,290 --> 00:21:26,250 >> Tegul ne eiti per visus čia funkcijų, 353 00:21:26,250 --> 00:21:29,500 bet vienas, kad atrodo, kad galbūt likusį interesų GetString 354 00:21:29,500 --> 00:21:32,790 nes paaiškėja, kad GetFloat, GetInt, GetDouble, GetLongLong 355 00:21:32,790 --> 00:21:36,260 kamuolio išmušimas iš rankų jų funkcionalumą GetString daug. 356 00:21:36,260 --> 00:21:39,750 Todėl galime imtis, kaip jis yra įgyvendinamas išvaizdą. 357 00:21:39,750 --> 00:21:43,630 Tai vienas atrodo šiek tiek sudėtinga, bet ji naudoja tuos pačius pagrindus 358 00:21:43,630 --> 00:21:45,670 , kad mes pradėjome kalbėti apie praeitą savaitę. 359 00:21:45,670 --> 00:21:49,490 Į GetString, kuris trunka jokio argumento, kaip už tuštumos čia 360 00:21:49,490 --> 00:21:53,730 ir grąžina eilutę, aš, matyt, skelbiantis eilutę vadinamas buferis. 361 00:21:53,730 --> 00:21:56,270 Aš ne tikrai žinote, kas tai bus naudojamas dar, bet mes žr. 362 00:21:56,270 --> 00:21:58,390 Atrodo, kad talpa yra pagal nutylėjimą 0. 363 00:21:58,390 --> 00:22:01,350 Ne visai tikras, kur tai vyksta, nežinote, kas n bus naudojamas dar, 364 00:22:01,350 --> 00:22:03,590 bet dabar tai vis šiek tiek įdomesnis. 365 00:22:03,590 --> 00:22:06,520 Atitinka 243, mes skelbiame Žiniasklaida, c. 366 00:22:06,520 --> 00:22:08,800 Tai tarsi kvailas išsamiai. 367 00:22:08,800 --> 00:22:15,820 Char yra 8 bitų, ir 8 bitai gali laikyti kiek skirtingas reikšmes? >> [Studentas] 256. >> 256. 368 00:22:15,820 --> 00:22:20,730 Problema yra, jei norite turėti 256 skirtingų ASCII simbolių, kurių yra 369 00:22:20,730 --> 00:22:23,340 jei manote, atgal - ir tai nėra kažkas, įsiminti. 370 00:22:23,340 --> 00:22:25,710 Bet jeigu jūs manote, kad didelis ASCII diagramos mes turėjome savaites, 371 00:22:25,710 --> 00:22:30,600 Tokiu atveju ten buvo 128 ar 256 ASCII simbolių. 372 00:22:30,600 --> 00:22:32,940 Mes naudojome visus 0s ir 1s up modelius. 373 00:22:32,940 --> 00:22:36,210 Tai problema, jei norite, kad būtų galima aptikti klaidą 374 00:22:36,210 --> 00:22:40,190 nes jei jūs jau naudojate 256 simbolių reikšmes, 375 00:22:40,190 --> 00:22:43,050 tu tikrai planuoti iš anksto, nes dabar jūs neturite to paties posakio, 376 00:22:43,050 --> 00:22:46,270 tai nėra teisėtas simbolis, tai yra kai klaidingas pranešimas. 377 00:22:46,270 --> 00:22:50,270 Taigi, ką pasaulis daro jie naudoja kitą didžiausią vertę, kažką panašaus į int, 378 00:22:50,270 --> 00:22:54,720 , kad jūs turite crazy bitų, 32, 4 milijardų galimų reikšmių 379 00:22:54,720 --> 00:22:58,860 kad galite tiesiog galų gale naudojant 257 iš jų iš esmės, 380 00:22:58,860 --> 00:23:01,720 Iš kurių 1 turi tam tikrą ypatingą reikšmę kaip klaida. 381 00:23:01,720 --> 00:23:03,120 >> Taigi pažiūrėkime, kaip tai veikia. 382 00:23:03,120 --> 00:23:07,760 246 atitinka, turiu tai didelis, o kilpa, kad skambina fgetc, 383 00:23:07,760 --> 00:23:11,090 f reikšmė failas, todėl getc, ir tada STDIN. 384 00:23:11,090 --> 00:23:15,520 Pasirodo, tai tik tiksliau pasakyti Skaityti įvesties iš klaviatūros. 385 00:23:15,520 --> 00:23:19,300 Standartinis įvesties tai klaviatūra, standartinį išvedimo ekraną, 386 00:23:19,300 --> 00:23:23,310 ir standartinė paklaida, kurią mes matysite pset4, reiškia ekraną 387 00:23:23,310 --> 00:23:27,490 bet specialų ekrano dalyje, kad jis manimi ne supainiojo faktinės produkcijos, 388 00:23:27,490 --> 00:23:30,750 kad jums skirtas spausdinti. Tačiau daugiau apie tai ateityje. 389 00:23:30,750 --> 00:23:34,440 Taigi fgetc tik perskaityti vieną simbolį iš klaviatūros ir laikyti jį ten, kur? 390 00:23:34,440 --> 00:23:37,350 Laikykite jį a. 391 00:23:37,350 --> 00:23:41,360 Ir tada patikrinkite, - todėl aš tiesiog naudojant kai kuriuos loginius jungtukai - 392 00:23:41,360 --> 00:23:46,000 patikrinkite, ar jis nėra lygus - \ n, todėl vartotojas paspauskite Enter, kad mes norime sustoti tame taške, 393 00:23:46,000 --> 00:23:49,850 kilpos pabaigos - ir mes taip pat norite patikrinti už ypatingą nuolat EOF, 394 00:23:49,850 --> 00:23:53,610 jei žinote, ar atspėti, ką jis stovėti? >> [Studentas] Bylos pabaiga. >> Pabaiga failą. 395 00:23:53,610 --> 00:23:56,560 Tai rūšies absurdiškas, nes jei aš rašyti į klaviatūrą, 396 00:23:56,560 --> 00:23:58,870 ten tikrai ne failas, dalyvauti šiame, 397 00:23:58,870 --> 00:24:01,150 bet tai tik rūšiuoti reiškia bendrinis terminas, naudojamas 398 00:24:01,150 --> 00:24:04,220 kad nieko ateina iš žmogaus pirštų. 399 00:24:04,220 --> 00:24:06,460 EOF - failo pabaiga. 400 00:24:06,460 --> 00:24:09,920 Kaip panaikinti, jei jūs kada nors nukentėjo valdymas D savo klaviatūros, ne tai, kad jums būtų dar 401 00:24:09,920 --> 00:24:15,230 jūs nukentėjo reguliatorius C - valdymas D siunčia ši speciali konstanta, vadinama EOF. 402 00:24:15,230 --> 00:24:19,850 Taigi, dabar mes tiesiog turime tam tikrą dinaminį atminties paskirstymas. 403 00:24:19,850 --> 00:24:23,440 >> Taigi, jei (n + 1> talpos). Dabar aš paaiškinti n. 404 00:24:23,440 --> 00:24:26,100 N, kiek baitų yra buferyje, 405 00:24:26,100 --> 00:24:28,620 eilutė, kad jūs šiuo metu iš vartotojo. 406 00:24:28,620 --> 00:24:33,450 Jei turite daugiau simbolių savo buferio nei turite pajėgumus buferyje, 407 00:24:33,450 --> 00:24:37,410 intuityviai, tai, ką mes turime padaryti, tada yra skirti daugiau pajėgumų. 408 00:24:37,410 --> 00:24:43,330 Todėl aš nugriebti kai aritmetinio čia ir sutelkti dėmesį tik į šią funkciją čia. 409 00:24:43,330 --> 00:24:46,070 Jūs žinote, ką malloc yra arba paprastai yra bent susipažinę. 410 00:24:46,070 --> 00:24:48,970 Spėti, kas realloc daro. >> [Studentas] Prideda atmintį. 411 00:24:48,970 --> 00:24:52,920 Tai ne visai pridedant atminties. Perskirsto atmintį taip. 412 00:24:52,920 --> 00:24:57,220 Jei dar yra kambarys eilutės pabaigoje, kad suteiktų jums daugiau, kad atmintis 413 00:24:57,220 --> 00:25:00,000 nei ji iš pradžių suteikia jums, tada jums gauti, kad papildomos atminties. 414 00:25:00,000 --> 00:25:03,460 Taigi galite tiesiog pradėti styginių simbolių atgal atgal atgal atgal. 415 00:25:03,460 --> 00:25:05,830 Bet jei tai ne tas atvejis, nes jūs pernelyg ilgai laukė 416 00:25:05,830 --> 00:25:07,940 ir kažkas atsitiktinai gavo plopped atmintyje 417 00:25:07,940 --> 00:25:10,290 bet yra papildomos atminties žemai čia, kad viskas gerai. 418 00:25:10,290 --> 00:25:13,100 Realloc ketina padaryti viską, didelių svorių iškėlimą už jus, 419 00:25:13,100 --> 00:25:16,750 perkelti eilutę, jūs perskaitėte, kad iki šiol čia, padėkite jį ten, 420 00:25:16,750 --> 00:25:19,460 ir tada duoti jums šiek tiek daugiau taką šiuo klausimu. 421 00:25:19,460 --> 00:25:22,550 >> Taigi su rankos banga, leiskite man pasakyti, kad tai, ką GetString daro 422 00:25:22,550 --> 00:25:26,330 ji pradeda su nedideliu buferio, gal vieną požymį, 423 00:25:26,330 --> 00:25:30,820 ir, jei vartotojas įveda į dviejų simbolių GetString baigiasi iki skambinate realloc ir sako 424 00:25:30,820 --> 00:25:33,150 vienas simbolis buvo nepakankamai, duok man du simbolius. 425 00:25:33,150 --> 00:25:35,950 Tada, jei jūs skaitote per kilpą logika, jis ketina pasakyti 426 00:25:35,950 --> 00:25:39,600 vartotojas turi įvesti 3 simbolių; Duok man dabar ne 2, bet 4 ženklai, 427 00:25:39,600 --> 00:25:42,320 tada duok man 8, tada duok man 16 ir 32. 428 00:25:42,320 --> 00:25:45,000 Tai, kad aš kiekvieną kartą padvigubinti Gebėjimų 429 00:25:45,000 --> 00:25:48,570 reiškia, kad buferis nesiruošia auga lėtai, ji ketina super greitai augti. 430 00:25:48,570 --> 00:25:51,380 Ir kas gali būti, kad privalumas? 431 00:25:51,380 --> 00:25:54,600 Kodėl aš dvigubai buferio dydis 432 00:25:54,600 --> 00:25:58,020 net jei vartotojas gali tiesiog reikia vieną papildomą simbolį iš klaviatūros? 433 00:25:58,020 --> 00:26:01,750 [Nesigirdi studentas atsakas] >> Kas tai? >> [Studentas] Jūs neturite auginti jį taip dažnai. 434 00:26:01,750 --> 00:26:03,300 Tiksliai. Jūs neturite auginti jį taip dažnai. 435 00:26:03,300 --> 00:26:05,510 Ir tai tik malonu iš jūsų esate apsidraudimo savo statymus čia, 436 00:26:05,510 --> 00:26:10,850 idėja yra ta, kad jūs nenorite skambinti realloc daug, nes jis linkęs būti lėtas. 437 00:26:10,850 --> 00:26:12,910 Bet kuriuo metu galite paklausti operacinė sistema atmintyje, 438 00:26:12,910 --> 00:26:16,990 kaip jūs netrukus pamatyti būsimą problemą,, jis yra linkęs šiek tiek laiko. 439 00:26:16,990 --> 00:26:20,010 Taip sumažinti, kad, kiek laiko, net jei jūs eikvoti šiek tiek erdvės, 440 00:26:20,010 --> 00:26:21,900 linkęs būti geras dalykas. 441 00:26:21,900 --> 00:26:24,060 >> Bet jei mes skaityti per baigiamoji dalis GetString čia - 442 00:26:24,060 --> 00:26:27,950 ir vėl suprasti kiekvieną eilutę čia yra ne taip svarbu šiandien - 443 00:26:27,950 --> 00:26:30,530 pastebėsite, kad galiausiai jis vėl ragina malloc 444 00:26:30,530 --> 00:26:33,880 ir ji skiria tiek baitų, kiek tiksliai taip, kaip jai reikia eilutę 445 00:26:33,880 --> 00:26:38,060 ir tada išmeta telefonu nemokamai pernelyg didelis buferis 446 00:26:38,060 --> 00:26:40,080 jei ji iš tikrųjų gavo dvigubai per daug kartų. 447 00:26:40,080 --> 00:26:42,730 Taigi trumpai tariant, tai, kaip GetString dirbo visą šį laiką. 448 00:26:42,730 --> 00:26:47,060 Visi jame yra skaityti vieną simbolį vienu metu vėl ir vėl ir vėl, 449 00:26:47,060 --> 00:26:50,750 ir kiekvieną kartą, ji reikia šiek tiek papildomos atminties, jis klausia, operacinę sistemą 450 00:26:50,750 --> 00:26:53,670 paskambinus realloc. 451 00:26:53,670 --> 00:26:57,890 >> Turite klausimų? Gerai. 452 00:26:57,890 --> 00:26:59,270 >> Ataka. 453 00:26:59,270 --> 00:27:04,060 Dabar, kai mes suprantame patarimų ar bent jau labiau susipažinę su rodyklės, 454 00:27:04,060 --> 00:27:06,700 pažiūrėkime, kaip visas pasaulis pradeda žlugti 455 00:27:06,700 --> 00:27:10,030 jei jūs neturite pakankamai ginti nuo rungimosi vartotojams, 456 00:27:10,030 --> 00:27:11,850 žmonių, kurie bando nulaužti į jūsų sistemą, 457 00:27:11,850 --> 00:27:16,890 žmonių, kurie bando pavogti jūsų registracijos kodą apeiti tam tikrą programinę įrangą 458 00:27:16,890 --> 00:27:19,090 kad jie gali kitaip įvesti in 459 00:27:19,090 --> 00:27:22,990 >> Paimkite pažvelgti į šį pavyzdį, kuris yra tik C kodas, kuris turi pagrindinę funkciją apačioje 460 00:27:22,990 --> 00:27:26,380 kad skambučiai funkcija foo. Ir nuo ko jis artimųjų foo? 461 00:27:26,380 --> 00:27:29,680 [Studentas] Vienintelis argumentas. >> [Malan] Vienintelis argumentas. 462 00:27:29,680 --> 00:27:33,450 Taigi argv [1], o tai reiškia, pirmas žodis, kuris vartotojas turi įvesti į komandų eilutę 463 00:27:33,450 --> 00:27:36,360 po a.out ar kas programa vadinama. 464 00:27:36,360 --> 00:27:41,680 Taigi foo viršuje mano char *. Bet char * yra tai, ką? >> [Studentas] eilutė. 465 00:27:41,680 --> 00:27:43,350 [Malan] eilutę, kad nieko naujo čia. 466 00:27:43,350 --> 00:27:45,420 Ši eilutė yra savavališkai yra vadinamas baras. 467 00:27:45,420 --> 00:27:51,430 Šioje eilutėje čia, char c [12]; tarsi pusiau techninės anglų, kas ši eilutė daro? 468 00:27:51,430 --> 00:27:55,220 [Studentas] masyvas - >> masyvas? >> [Studentas] spalva. >> Charakteriai. 469 00:27:55,220 --> 00:27:58,870 Duok man 12 simbolių masyvas. Taigi galėtume pavadinti tai buferis. 470 00:27:58,870 --> 00:28:02,920 Techniškai vadinama c, bet programavimo buferis tiesiog reiškia vietos krūva 471 00:28:02,920 --> 00:28:04,800 , kad jūs galite įdėti kai kurių dalykų in 472 00:28:04,800 --> 00:28:07,940 Tada galiausiai, memcpy mes ne naudoti prieš, bet jums greičiausiai gali atspėti, ką ji daro. 473 00:28:07,940 --> 00:28:10,480 Kopijuoja atmintį. Ką jis daro? 474 00:28:10,480 --> 00:28:19,270 Tai, matyt, kopijuoja baras, jo indėlis į C, bet tik iki juostos ilgis. 475 00:28:19,270 --> 00:28:24,930 Bet ten klaida čia. >> [Studentas] Jūs turite sizeof charakterį. >> Gerai. 476 00:28:24,930 --> 00:28:30,860 Techniškai, turėtume tikrai strlen (bar) * sizeof (char)). Tai teisinga. 477 00:28:30,860 --> 00:28:33,930 Bet blogiausiu atveju čia, galime manyti, kad that 478 00:28:33,930 --> 00:28:35,950 Gerai. Tada ten dvi klaidas. 479 00:28:35,950 --> 00:28:39,160 Taigi, sizeof (char)); 480 00:28:39,160 --> 00:28:41,290 Padarykime tai šiek tiek platesnis. 481 00:28:41,290 --> 00:28:44,910 Taigi, dabar dar yra klaida, o tai, ką? >> [Nesigirdi studentas atsakas] 482 00:28:44,910 --> 00:28:46,990 Patikrinkite už ką? >> [Studentas] Patikrinkite NULL. 483 00:28:46,990 --> 00:28:50,270 Mes paprastai turėtų būti patikrinti, ar nulis, nes blogi dalykai nutinka 484 00:28:50,270 --> 00:28:53,200 , kai jūsų rodyklė NULL, nes jums gali galų gale vyksta ten, 485 00:28:53,200 --> 00:28:57,630 , ir jūs turite ne kada nors bus vyksta į NULL, dereferencing su žvaigždutėmis operatoriaus. 486 00:28:57,630 --> 00:29:01,050 Taigi, kad gerai. Ir ką mes darome? Logiškai mąstant, trūkumas čia. 487 00:29:01,050 --> 00:29:04,450 [Studentas] Patikrinkite, ar argc yra> = 2. 488 00:29:04,450 --> 00:29:10,550 Taigi, patikrinkite, jei argc> = 2. Gerai, kad yra trys šios programos klaidas. 489 00:29:10,550 --> 00:29:16,630 Stebima tikrinti, ar vartotojas iš tikrųjų įvestas nieko į argv [1]. Geras. 490 00:29:16,630 --> 00:29:20,950 Taigi, kas yra trečiasis klaidą? Taip. >> [Studentas] C gali būti pakankamai didelis. 491 00:29:20,950 --> 00:29:23,320 Geras. Mes patikrinome vienas scenarijus. 492 00:29:23,320 --> 00:29:29,520 Mes netiesiogiai patikrinti, nekopijuokite daugiau atminties nei viršyti juostos ilgis. 493 00:29:29,520 --> 00:29:32,510 Taigi, jei eilutė vartotojas turi įvesti 10 simbolių, 494 00:29:32,510 --> 00:29:36,020 tai sako tik nukopijuoti 10 simbolių. Ir tai gerai. 495 00:29:36,020 --> 00:29:39,940 Bet kas, jei vartotojas turi įvesti ne kaip 20-simbolių žodžio eilutę žodį? 496 00:29:39,940 --> 00:29:44,900 Tai sakydamas kopiją 20 simbolių iš baro į tai, ką? 497 00:29:44,900 --> 00:29:49,750 C, kitaip žinomas kaip mūsų buferio, kuris reiškia, kad jūs tiesiog parašė duomenis 498 00:29:49,750 --> 00:29:52,540 8 baitų vietose, kad jūs neturite savo, 499 00:29:52,540 --> 00:29:54,870 ir jūs neturite juos ta prasme, kad jūs niekada paskyrusios. 500 00:29:54,870 --> 00:30:00,370 Taigi, tai, kas paprastai žinomas kaip buferio perpildymo atakos ar buferio ataka. 501 00:30:00,370 --> 00:30:05,580 Ir tai ta prasme, ataka, kad jei vartotojas arba programa, kuri skambina savo funkciją 502 00:30:05,580 --> 00:30:10,490 tai daro piktavališkai, kas iš tikrųjų vyksta šalia, iš tiesų gali būti gana neblogai. 503 00:30:10,490 --> 00:30:12,450 >> Todėl galime imtis į šį vaizdą čia. 504 00:30:12,450 --> 00:30:16,060 Ši nuotrauka yra jūsų atminties krūvą. 505 00:30:16,060 --> 00:30:19,580 Prisiminkite, kad kiekvieną kartą, kai skambinate funkciją gauti šį mažą rėmelį kamino 506 00:30:19,580 --> 00:30:21,520 ir tada kitą, ir tada dar vieną ir dar. 507 00:30:21,520 --> 00:30:24,300 Ir iki šiol, mes tiesiog rūšies išgaunamo tai kaip stačiakampių 508 00:30:24,300 --> 00:30:26,290 arba ant lentos arba ekrane čia. 509 00:30:26,290 --> 00:30:30,580 Bet jei mes priartinti vieną iš šių stačiakampių, kai skambinate funkcijos foo, 510 00:30:30,580 --> 00:30:35,880 paaiškėja, kad yra daugiau šio stačiakampio kamino viduje šio kadro 511 00:30:35,880 --> 00:30:40,060 kaip tik x ir y ir a ir b punktai, kaip mes kalbame apie apsikeitimo sandorio. 512 00:30:40,060 --> 00:30:44,410 Paaiškėja, kad yra keletas žemesnio lygio detales, tarp jų ir atgalinį adresą. 513 00:30:44,410 --> 00:30:49,550 Taigi paaiškėja, kai pagrindinis ragina foo, pagrindinis turi informuoti foo 514 00:30:49,550 --> 00:30:53,520 pagrindinis adresas yra kompiuterio atmintyje 515 00:30:53,520 --> 00:30:57,770 nes kitaip, kuo greičiau foo vykdymas, kaip šiuo atveju čia 516 00:30:57,770 --> 00:31:00,830 kai jūs pasieksite šį uždarą garbanotas petnešomis iš foo pabaigoje, 517 00:31:00,830 --> 00:31:05,310 kaip gi Foo žinoti, kur programos kontrolė turėjo eiti? 518 00:31:05,310 --> 00:31:08,970 It turns out, kad atsakymas į šį klausimą yra šitoje stačiakampio čia. 519 00:31:08,970 --> 00:31:12,670 Tai rodo, kad žymeklis, ir tai laikinai laikyti prie kompiuterio 520 00:31:12,670 --> 00:31:17,030 vadinamosios kamino pagrindinis adresas yra padaryta taip, kad kuo greičiau foo vykdyti 521 00:31:17,030 --> 00:31:21,120 kompiuteris žino, kur ir ką linija pagrindinis grįžti į. 522 00:31:21,120 --> 00:31:23,940 Išsaugotos Rėmas rodyklė panašiai. 523 00:31:23,940 --> 00:31:26,310 Char * baras čia yra kas? 524 00:31:26,310 --> 00:31:31,350 Dabar šis mėlynas segmentas čia Foo rėmo. Kas yra baras? 525 00:31:31,570 --> 00:31:35,010 Baras yra tik foo funkcijos argumentas. 526 00:31:35,010 --> 00:31:37,500 Taigi dabar mes rūšiuoti pažįstamą vaizdą. 527 00:31:37,500 --> 00:31:39,850 Yra daugiau daiktų ir daugiau ramiai ekrane, 528 00:31:39,850 --> 00:31:43,380 bet tai šviesiai mėlyna segmentas tiesiog yra tai, ką mes buvo piešimo lentos 529 00:31:43,380 --> 00:31:45,790 apsikeitimo sandorio kažką panašaus. Kad yra rėmas foo. 530 00:31:45,790 --> 00:31:51,490 Ir vienintelis dalykas, dabar yra baras, kuriame yra šis parametras. 531 00:31:51,490 --> 00:31:55,220 Bet ką dar turėtų būti kamino pagal šio kodekso čia? 532 00:31:55,220 --> 00:31:57,760 [Studentas] char c [12]. >> [Malan] char c [12]. 533 00:31:57,760 --> 00:32:02,810 Mes taip pat turėtumėte pamatyti 12 kvadratų atminties skiriama kintamasis, vadinamas C, 534 00:32:02,810 --> 00:32:04,970 ir iš tikrųjų mes turime, kad ekrane. 535 00:32:04,970 --> 00:32:08,480 Pačiame viršuje yra [0], tada šioje diagramoje autorius 536 00:32:08,480 --> 00:32:11,850 nesivargino piešimo kvadratų, bet iš tiesų yra 12 nėra 537 00:32:11,850 --> 00:32:16,590 nes jei peržvelgsite apačioje, dešinėje pusėje, c [11], jei skaičiuoti nuo 0 12 pavyzdžiui baitų. 538 00:32:16,590 --> 00:32:18,400 Bet čia yra problema. 539 00:32:18,400 --> 00:32:22,390 Kuria kryptimi c auga? 540 00:32:22,390 --> 00:32:27,080 Rūšiuoti viršaus į apačią ", jei ji pradeda viršuje ir auga į apačią. 541 00:32:27,080 --> 00:32:30,110 Ji atrodo ne taip, kaip mes palikome sau daug kilimo ir tūpimo tako, čia ne visiems. 542 00:32:30,110 --> 00:32:32,090 Mes rūšies dažytos save į kampą, 543 00:32:32,090 --> 00:32:36,940 ir kad c [11] yra teisus prieš bare, kuris yra prieš Išsaugoti Frame rodyklė, 544 00:32:36,940 --> 00:32:39,960 kuris yra teisus prieš atgalinį adresą. Yra daugiau nebėra. 545 00:32:39,960 --> 00:32:42,810 Taigi, kas yra potekstė tada, jei jūs susukti 546 00:32:42,810 --> 00:32:46,500 ir bandote skaityti 20 baitų į 12-baitų buferio? 547 00:32:46,500 --> 00:32:50,060 Kur šie 8 papildomi baitai ketinate eiti? >> [Studentas] Viduje - 548 00:32:50,060 --> 00:32:53,200 Viduje visa kita, kai kurie iš jų yra super svarbu. 549 00:32:53,200 --> 00:32:57,260 Ir svarbiausias dalykas, galbūt, yra raudonas langelis, atgalinis adresas, 550 00:32:57,260 --> 00:33:03,560 , nes manome, kad Jus netyčia arba adversarially perrašyti tuos 4 baitai, 551 00:33:03,560 --> 00:33:07,260 kad rodyklė adresas, ne tik su šiukšlių, bet su numeriu 552 00:33:07,260 --> 00:33:09,810 tai atsitiks taip, kad atspindėtų faktinį adresą atmintyje. 553 00:33:09,810 --> 00:33:13,880 Kas yra potekstė, logiškai? >> [Studentas] Funkcijų ketina grįžti į kitą vietą. 554 00:33:13,880 --> 00:33:15,250 Tiksliai. 555 00:33:15,250 --> 00:33:19,170 Jeigu foo grįžta ir hitai, kad garbanotas petnešomis, programa ketina tęsti 556 00:33:19,170 --> 00:33:25,060 Norėdami grįžti į pagrindinį, jis ketina grįžti į kokia adresas yra to raudono lange. 557 00:33:25,060 --> 00:33:28,600 >> Apeiti programinės įrangos registracijos, 558 00:33:28,600 --> 00:33:32,260 ką daryti, jei adresas, grįžo į yra funkcija, kuri paprastai iškviečiamas 559 00:33:32,260 --> 00:33:35,690 po to, kai sumokėta už programinę įrangą ir įvestas registracijos kodą? 560 00:33:35,690 --> 00:33:39,870 Jūs galite rūšiuoti apgauti kompiuterio į nesiruošia čia, bet vietoj einame čia. 561 00:33:39,870 --> 00:33:45,100 Arba jei esate tikrai protingas, priešininkas iš tikrųjų galite įvesti ne klaviatūra, pavyzdžiui, 562 00:33:45,100 --> 00:33:50,690 o ne tikrasis žodis, ne 20 simbolių, bet tarkime, kad jis ar ji iš tikrųjų tipai 563 00:33:50,690 --> 00:33:52,770 keletas simbolių, kurie atstovauja kodą. 564 00:33:52,770 --> 00:33:55,320 Ir jis nesiruošia būti C kodas, tai tikrai bus simboliai 565 00:33:55,320 --> 00:33:59,290 kurios atstovauja dvejetainius mašininį kodą, 0s ir 1s. 566 00:33:59,290 --> 00:34:01,290 Tačiau tarkime, jie yra pakankamai protingas, tai padaryti, 567 00:34:01,290 --> 00:34:06,500 kažkaip įklijuokite į GetString eilutę kažką, kad yra iš esmės surinkti kodą, 568 00:34:06,500 --> 00:34:09,980 ir paskutinius 4 baitai perrašyti atgalinį adresą. 569 00:34:09,980 --> 00:34:13,360 O koks adresas, kad įvesties daryti? 570 00:34:13,360 --> 00:34:18,630 Ji iš tikrųjų saugo šitoje stačiakampio pirmojo baito adresas buferio. 571 00:34:18,630 --> 00:34:23,070 Taigi, jūs turite būti tikrai protingas, ir tai yra daug bandymų ir klaidų, blogų žmonių iš ten, 572 00:34:23,070 --> 00:34:25,639 bet jei galite išsiaiškinti, kaip didelis buferis yra 573 00:34:25,639 --> 00:34:28,820 toks, kad per pastaruosius keletą baitų įėjimo jūs pateikiate programos 574 00:34:28,820 --> 00:34:33,540 atsitikti, kad atitinka savo buferio pradžios adresą, galite tai padaryti. 575 00:34:33,540 --> 00:34:39,320 Jei mes sakome paprastai hello and \ 0, tai, kas galų gale į buferį. 576 00:34:39,320 --> 00:34:44,420 Bet jei mes protingas ir mes užpildome, kad buferis su tuo, ką mes bendrine skambinti atakos kodą 577 00:34:44,420 --> 00:34:48,860 AAA, ataka, ataka, puolimas - tai tik kažkas, kad daro kažką blogo, 578 00:34:48,860 --> 00:34:51,820 kas atsitiks, jei jūs tikrai protingas, galite tai padaryti. 579 00:34:51,820 --> 00:34:58,610 , Raudoname laukelyje čia skaitmenų seka - 80, C0, 35, 08. 580 00:34:58,610 --> 00:35:01,610 Atkreipkite dėmesį, kad, kuris atitinka skaičių, kuris čia. 581 00:35:01,610 --> 00:35:04,430 Tai atvirkštine eilės tvarka, bet daugiau, kad kitu metu. 582 00:35:04,430 --> 00:35:08,140 Atkreipkite dėmesį, kad tai atgalinis adresas buvo tyčia pakeistas 583 00:35:08,140 --> 00:35:12,020 lygus adresą čia, o ne pagrindinio adreso. 584 00:35:12,020 --> 00:35:17,500 Taigi, jei blogiukas yra super protingas, jis ar ji ketina įtraukti, kad ataka kodą 585 00:35:17,500 --> 00:35:20,930 kažkas panašaus i ¹ trinti visus vartotojo failus ar kopijuoti slaptažodžius 586 00:35:20,930 --> 00:35:24,680 arba sukurti vartotojo abonementą, kad galiu prisijungti prie - nieko. 587 00:35:24,680 --> 00:35:26,950 >> Ir tai yra pavojus ir C. galia 588 00:35:26,950 --> 00:35:29,840 Nes per rodykles jūs turite prieigą prie atminties 589 00:35:29,840 --> 00:35:32,520 Todėl galite rašyti viską, ką nori, į kompiuterio atmintį, 590 00:35:32,520 --> 00:35:35,080 jūs galite padaryti kompiuterį daryti viską, ką nori 591 00:35:35,080 --> 00:35:39,550 tiesiog šokinėti per savo atminties. 592 00:35:39,550 --> 00:35:44,650 Ir taip iki šių dienų tiek daug programų ir tiek daug svetainių, kyla pavojus, 593 00:35:44,650 --> 00:35:46,200 skliautais žmonėms pasinaudoti šia. 594 00:35:46,200 --> 00:35:50,760 Ir tai gali atrodyti super sudėtingų užpuolimo, tačiau ji ne visada pradėti, kad taip. 595 00:35:50,760 --> 00:35:53,560 Realybė yra tai, ką blogi žmonės paprastai padaryti, 596 00:35:53,560 --> 00:35:58,200 ar tai komandinės eilutės programa arba GUI programa ar svetainė, 597 00:35:58,200 --> 00:35:59,940 jūs tiesiog pradėti teikti nesąmonė. 598 00:35:59,940 --> 00:36:03,980 Jūs tipo tikrai didelis žodį į paieškos laukelyje ir paspauskite "Enter", 599 00:36:03,980 --> 00:36:05,780 ir laukti, kad pamatytumėte, jei svetainė sugenda 600 00:36:05,780 --> 00:36:09,990 ar laukti, kad pamatytumėte, jei programa pasireiškia kai klaidos pranešimą 601 00:36:09,990 --> 00:36:14,330 nes jei jums pasisekė, nes blogiukas ir jūs nors crazy įvestį 602 00:36:14,330 --> 00:36:18,980 dėl kurios stringa "programą, tai reiškia, kad programuotojas nesitikėjo savo blogą elgesį, 603 00:36:18,980 --> 00:36:23,630 , o tai reiškia, jūs galite tikriausiai pakankamai pastangų, pakankamai bandymų ir klaidų, 604 00:36:23,630 --> 00:36:26,650 išsiaiškinti, kaip darbo užmokesčio tiksliau ataką. 605 00:36:26,650 --> 00:36:31,410 Taigi, kaip daug saugumo dalis yra ne tik išvengti šiuos išpuolius iš viso 606 00:36:31,410 --> 00:36:34,100 bet ir nustatyti juos ir iš tikrųjų žiūri rąstų 607 00:36:34,100 --> 00:36:36,780 ir pamatyti, ką Crazy įėjimai žmonių įvedėte į savo svetainę, 608 00:36:36,780 --> 00:36:38,960 kokius paieškos terminus, kad žmonės įvedėte į savo svetainę 609 00:36:38,960 --> 00:36:42,870 tikisi šiek tiek buferis perpildyta. 610 00:36:42,870 --> 00:36:45,500 Ir visa tai suvesta į paprastų pagrindų ką masyvas 611 00:36:45,500 --> 00:36:49,080 ir ką jis reiškia, paskirstyti ir panaudoti atmintį. 612 00:36:49,080 --> 00:36:51,710 >> Susiję su, kad tada per tai. 613 00:36:51,710 --> 00:36:54,280 Tegul tik iš pirmo žvilgsnio viduje kietąjį diską dar kartą. 614 00:36:54,280 --> 00:36:58,440 Jūs prisimenate, kad per savaitę ar dvi prieš, kad, kai jūs vilkite failus į jūsų šiukšlinę ar šiukšliadėžės, 615 00:36:58,440 --> 00:37:03,710 kas atsitiks? >> [Studentas] Nieko. >> Absoliučiai nieko, tiesa? 616 00:37:03,710 --> 00:37:05,740 Galų gale, jei jūs naudojate mažai vietos diske, 617 00:37:05,740 --> 00:37:08,190 "Windows" arba "Mac OS pradės jums ištrinti failus. 618 00:37:08,190 --> 00:37:10,390 Bet, jei vilkite kažką ten, kad yra ne visi saugus. 619 00:37:10,390 --> 00:37:13,800 Visi jūsų kambarioku ar draugas ar šeimos narys turi daryti dukart spustelėkite ir voila, 620 00:37:13,800 --> 00:37:16,310 ten visi apytikrės failų, kurie bandė jį pašalinti. 621 00:37:16,310 --> 00:37:19,590 Daugelis iš mūsų bent žinoti, kad jūs turite paspausti dešiniuoju pelės klavišu arba Spustelkite 622 00:37:19,590 --> 00:37:22,310 Išvalyti šiukšlinę ar kažkas panašaus. 623 00:37:22,310 --> 00:37:25,000 Bet net ir tada, kad nėra gana padaryti pavyko 624 00:37:25,000 --> 00:37:28,010 nes tai, kas atsitinka, kai jūs turite failą kietajame diske 625 00:37:28,010 --> 00:37:32,770 , kuris atstovauja kai "Word" dokumentą arba kai JPEG, ir tai yra jūsų kietajame diske, 626 00:37:32,770 --> 00:37:35,350 ir tegul sako, tai rakštis čia atstovauja šį failą, 627 00:37:35,350 --> 00:37:38,390 ir tai sudaro visa krūva 0s ir 1s. 628 00:37:38,390 --> 00:37:42,470 Kas atsitinka, kai jūs ne tik vilkite failą į šiukšlinę gali arba šiukšlinę 629 00:37:42,470 --> 00:37:48,020 bet ir ištuštinti? Rūšiuoti nieko. 630 00:37:48,020 --> 00:37:49,640 Tai nėra absoliučiai nieko dabar. 631 00:37:49,640 --> 00:37:54,290 Dabar jis tiesiog nieko, nes šiek tiek kažkas atsitinka šios lentelės forma. 632 00:37:54,290 --> 00:37:58,370 Taigi yra kai kurie iš duomenų bazės arba stalo rūšies viduje kompiuterio atmintyje 633 00:37:58,370 --> 00:38:03,850 , kad iš esmės yra vienas stulpelis rinkmenose pavadinimų ir vienas stulpelis failus buvimo vietą, 634 00:38:03,850 --> 00:38:07,720 tais atvejais, kai tai gali būti vieta 123, tik atsitiktinis skaičius. 635 00:38:07,720 --> 00:38:14,560 Taigi, mes galime turėti kažką panašaus x.jpeg ir Vieta 123. 636 00:38:14,560 --> 00:38:18,800 Kas atsitinka po to, kai jūs iš tikrųjų išvalyti šiukšlinę? 637 00:38:18,800 --> 00:38:20,330 Kad nueina. 638 00:38:20,330 --> 00:38:23,610 Bet kas, neišnyksta 0s ir 1s. 639 00:38:23,610 --> 00:38:26,270 >> Taigi, kas tada jungtis prie pset4? 640 00:38:26,270 --> 00:38:31,240 Na, su pset4, tik todėl, kad mes netyčia ištrinti Compact Flash Card 641 00:38:31,240 --> 00:38:35,750 kad visi iš šių nuotraukų, arba tiesiog, nes jis turėjo nesėkme tapo sugadintas 642 00:38:35,750 --> 00:38:38,000 nereiškia, kad 0s ir 1s nėra dar ten. 643 00:38:38,000 --> 00:38:40,410 Gal keli iš jų yra prarastas, nes kažkas gavo sugadintas 644 00:38:40,410 --> 00:38:43,320 ta prasme, kad kai 0s tapo 1s ir 1s tapo 0s. 645 00:38:43,320 --> 00:38:47,240 Blogi dalykai gali atsitikti dėl Buggy programinės įrangos ar trūkumais techninės įrangos. 646 00:38:47,240 --> 00:38:50,370 Bet daugelis iš tų bitų, o gal net 100% iš jų, vis dar ten. 647 00:38:50,370 --> 00:38:55,050 Tai tiesiog, kad kompiuteris ar fotoaparatas nežino, kur JPEG1 pradėjo 648 00:38:55,050 --> 00:38:56,910 ir kur JPEG2 prasidėjo. 649 00:38:56,910 --> 00:39:01,070 Bet jeigu jūs, programuotojas, žino, su šiek tiek išminties, kai šie JPEG 650 00:39:01,070 --> 00:39:06,010 ar tai, ką jie atrodo, todėl jūs galite analizuoti 0s ir 1s ir pasakyti JPEG, JPEG, 651 00:39:06,010 --> 00:39:09,440 galite parašyti programą su iš esmės tik už arba while cikle 652 00:39:09,440 --> 00:39:12,820 , kuris atgauna kiekvieną šių failų. 653 00:39:12,820 --> 00:39:16,030 Taigi pamoka tada pradėti saugiai ištrinti savo failus 654 00:39:16,030 --> 00:39:18,340 jei norite, siekiant to išvengti visiškai. Taip. 655 00:39:18,340 --> 00:39:21,010 >> [Studentas] Kaip tai ji sako apie jūsų kompiuteryje 656 00:39:21,010 --> 00:39:23,550 , kad turite daugiau atminties, nei jūs veikėte anksčiau? 657 00:39:23,550 --> 00:39:27,820 Turi daugiau atminties, nei jūs veikėte anksčiau - >> [studentas] daugiau laisvos atminties. 658 00:39:27,820 --> 00:39:29,630 Oh. Geras klausimas. 659 00:39:29,630 --> 00:39:32,360 Tad kodėl tada po ištuštinti šiukšlinę, ar jūsų kompiuteris pasakys, 660 00:39:32,360 --> 00:39:34,910 , kad turite daugiau laisvos vietos nei jūs veikėte anksčiau? 661 00:39:34,910 --> 00:39:36,770 Trumpai tariant, nes jis guli. 662 00:39:36,770 --> 00:39:40,740 Daugiau techniškai, jūs turite daugiau vietos, nes dabar jūs sakėte 663 00:39:40,740 --> 00:39:43,680 galite įdėti kitų dalykų, kur kažkada buvo, kad byla. 664 00:39:43,680 --> 00:39:45,450 Bet tai nereiškia, kad bitai išvykstate, 665 00:39:45,450 --> 00:39:48,590 ir tai nereiškia, kad bitai yra pakeistas į visų 0s, pavyzdžiui, 666 00:39:48,590 --> 00:39:50,150 dėl jūsų saugumo. 667 00:39:50,150 --> 00:39:54,640 Taigi, priešingai, jei saugiai ištrinti failus arba fiziškai sunaikinti prietaisą, 668 00:39:54,640 --> 00:39:57,300 kad tikrai yra kartais vienintelis būdas aplink, kad. 669 00:39:57,300 --> 00:40:02,020 >> Tad kodėl gi ne mes palikti tą pusiau baisu pastaboje, ir mes matome, pirmadienį. 670 00:40:02,020 --> 00:40:07,000 [Plojimai] 671 00:40:07,780 --> 00:40:10,000 >> [CS50.TV]