>> 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ą?