1 00:00:00,000 --> 00:00:00,180 2 00:00:00,180 --> 00:00:02,920 >> GARSIAKALBIS 1: Tegul parašyti programą, kuri gauna eilutę iš vartotojui be 3 00:00:02,920 --> 00:00:05,700 naudojant CS50 bibliotekos veikti GetString. 4 00:00:05,700 --> 00:00:08,720 Norėdami tai padaryti, mes eiti į priekį ir naudoti Scanf, funkcija, kuri GetString 5 00:00:08,720 --> 00:00:10,950 funkcija faktiškai naudoja po gaubtu. 6 00:00:10,950 --> 00:00:13,780 Bet aš ruošiuosi tai padaryti sąmoningai vežimėlyje būdu. 7 00:00:13,780 --> 00:00:17,230 Aš ruošiuosi padaryti taip, kad manau, būtų teisinga, bet paaiškėja, kad 8 00:00:17,230 --> 00:00:19,380 mano prielaida vyksta gana, gana ydinga. 9 00:00:19,380 --> 00:00:20,800 Ir iš tiesų, gana pavojinga. 10 00:00:20,800 --> 00:00:24,750 Nes klaidų, pavyzdžiui, vienas aš apie kad gali būti išnaudojami priešininkais 11 00:00:24,750 --> 00:00:28,870 pavyzdžiui, kad jūsų mašina ar jūsų programa gali būti paimama potencialiai. 12 00:00:28,870 --> 00:00:30,200 >> Pradėkime taip. 13 00:00:30,200 --> 00:00:33,540 Pirmiausia leiskite pareikšti savo eilutę, kitaip žinoma dabar kaip char žvaigždė, 14 00:00:33,540 --> 00:00:34,750 ir vadina tai s. 15 00:00:34,750 --> 00:00:39,400 Leidžia kitą eilutę styginių vartotoją, kaip su "string prašom." Ir 16 00:00:39,400 --> 00:00:44,250 tegul dabar gauti eilutę iš vartotojo naudojant scanf, citata citatos, "% s." Į 17 00:00:44,250 --> 00:00:47,760 Kitaip tariant, galime informuoti Scanf kad mes Ar iš tikrųjų tikėtis gauti eilutę 18 00:00:47,760 --> 00:00:48,630 nuo naudotojo. 19 00:00:48,630 --> 00:00:50,810 >> Bet dabar mes turime pasakyti scanf vienas kitas dalykas - 20 00:00:50,810 --> 00:00:53,350 kur dėti eilutę, vartotojas pateikia. 21 00:00:53,350 --> 00:00:57,840 Na, aš ruošiuosi paprasčiausiai pradėti su kableliu ai, nurodant, kad aš norėčiau 22 00:00:57,840 --> 00:00:59,320 Scanf įdėti eilutę ten. 23 00:00:59,320 --> 00:01:04,818 Aš kitą ketinate spausdinti kažką kaip printf "ačiū už% s 24 00:01:04,818 --> 00:01:10,670 Backslash n kablelis. "Ir kaip visada, aš ketina pereiti į eilutę, s. 25 00:01:10,670 --> 00:01:14,920 Dabar galime išsaugoti, kaupti, ir paleisti tai programa, ir pamatyti, jei mes negalime sukelti 26 00:01:14,920 --> 00:01:16,590 problema, aš prognozuojama. 27 00:01:16,590 --> 00:01:18,650 >> Padaryti Scanf-1. 28 00:01:18,650 --> 00:01:20,960 ./scanf-1. 29 00:01:20,960 --> 00:01:21,830 Styginių prašom. 30 00:01:21,830 --> 00:01:25,540 Leiskite pateikti kažką panašaus, "labas". "Ačiū už nulį." Hmm, tai ne 31 00:01:25,540 --> 00:01:26,750 ką aš tikėjosi. 32 00:01:26,750 --> 00:01:28,240 Taigi, kas čia vyksta? 33 00:01:28,240 --> 00:01:32,040 >> Na, it turns out, nes mes paskelbėme ai kaip char žvaigždė, bet mes ne 34 00:01:32,040 --> 00:01:36,120 iš tikrųjų saugomi ai apie adresą Tikrasis riekė atminties, Scanf nebuvo 35 00:01:36,120 --> 00:01:38,940 niekur įdėti eilutę kad vartotojas turi įvesti in 36 00:01:38,940 --> 00:01:42,510 Iš tiesų, jei vartotojas buvo dabar tipo daug ilgiau styginių nei "labas" 37 00:01:42,510 --> 00:01:46,780 pavyzdžiui kelių eilučių teksto arba keletas pastraipų tekstą, tai gana 38 00:01:46,780 --> 00:01:50,280 Gali būti, kad mes gali sukelti Vadinamasis segmentavimo kaltės. 39 00:01:50,280 --> 00:01:53,570 >> Kadangi Scanf nesiruošia žinoti, kad Aš ne iš tikrųjų įdėti adresą 40 00:01:53,570 --> 00:01:54,610 viduje s. 41 00:01:54,610 --> 00:01:58,000 Atvirkščiai, tai bus matyti tam tikrą vertę s, kai modelis bitai, kurie gali 42 00:01:58,000 --> 00:02:00,910 labai gerai būti šiukšlių vertė, ten tiesiog atsitiktinai. 43 00:02:00,910 --> 00:02:04,600 Ir Scanf vis dar ketina pabandyti parašyti vartotojo eilutę į tą adresą, 44 00:02:04,600 --> 00:02:08,789 net jei jis yra šiukšlių vertę, kuri iš tiesų galėtų sukelti avariją. 45 00:02:08,789 --> 00:02:10,130 >> Taigi, kaip mes ketiname išspręsti šią problemą? 46 00:02:10,130 --> 00:02:12,523