GARSIAKALBIS 1: Tegul parašyti programą, kuri gauna eilutę iš vartotojui be naudojant CS50 bibliotekos veikti GetString. Norėdami tai padaryti, mes eiti į priekį ir naudoti Scanf, funkcija, kuri GetString funkcija faktiškai naudoja po gaubtu. Bet aš ruošiuosi tai padaryti sąmoningai vežimėlyje būdu. Aš ruošiuosi padaryti taip, kad manau, būtų teisinga, bet paaiškėja, kad mano prielaida vyksta gana, gana ydinga. Ir iš tiesų, gana pavojinga. Nes klaidų, pavyzdžiui, vienas aš apie kad gali būti išnaudojami priešininkais pavyzdžiui, kad jūsų mašina ar jūsų programa gali būti paimama potencialiai. Pradėkime taip. Pirmiausia leiskite pareikšti savo eilutę, kitaip žinoma dabar kaip char žvaigždė, ir vadina tai s. Leidžia kitą eilutę styginių vartotoją, kaip su "string prašom." Ir tegul dabar gauti eilutę iš vartotojo naudojant scanf, citata citatos, "% s." Į Kitaip tariant, galime informuoti Scanf kad mes Ar iš tikrųjų tikėtis gauti eilutę nuo naudotojo. Bet dabar mes turime pasakyti scanf vienas kitas dalykas - kur dėti eilutę, vartotojas pateikia. Na, aš ruošiuosi paprasčiausiai pradėti su kableliu ai, nurodant, kad aš norėčiau Scanf įdėti eilutę ten. Aš kitą ketinate spausdinti kažką kaip printf "ačiū už% s Backslash n kablelis. "Ir kaip visada, aš ketina pereiti į eilutę, s. Dabar galime išsaugoti, kaupti, ir paleisti tai programa, ir pamatyti, jei mes negalime sukelti problema, aš prognozuojama. Padaryti Scanf-1. ./scanf-1. Styginių prašom. Leiskite pateikti kažką panašaus, "labas". "Ačiū už nulį." Hmm, tai ne ką aš tikėjosi. Taigi, kas čia vyksta? Na, it turns out, nes mes paskelbėme ai kaip char žvaigždė, bet mes ne iš tikrųjų saugomi ai apie adresą Tikrasis riekė atminties, Scanf nebuvo niekur įdėti eilutę kad vartotojas turi įvesti in Iš tiesų, jei vartotojas buvo dabar tipo daug ilgiau styginių nei "labas" pavyzdžiui kelių eilučių teksto arba keletas pastraipų tekstą, tai gana Gali būti, kad mes gali sukelti Vadinamasis segmentavimo kaltės. Kadangi Scanf nesiruošia žinoti, kad Aš ne iš tikrųjų įdėti adresą viduje s. Atvirkščiai, tai bus matyti tam tikrą vertę s, kai modelis bitai, kurie gali labai gerai būti šiukšlių vertė, ten tiesiog atsitiktinai. Ir Scanf vis dar ketina pabandyti parašyti vartotojo eilutę į tą adresą, net jei jis yra šiukšlių vertę, kuri iš tiesų galėtų sukelti avariją. Taigi, kaip mes ketiname išspręsti šią problemą?