>> SPEAKER 1: Oletame, kirjutada programm, mis saab string kasutaja ilma
kasutades CS50 Raamatukogu toimida getString.
Et seda teha, siis me minna ja kasutada scanf funktsioon, et getString
funktsioon tegelikult kasutab all kapuuts.
Aga ma teen seda tahtlikult aastal lollakas viisil.
Ma teen nii, et ma arvan, et oleks õige, kuid selgub, et
minu oletus läheb üsna, üsna puudulik.
Ja tõepoolest, üsna ohtlik.
Sest vigu nagu ma olen umbes teha saab ära kasutada vastaste
nii, et teie masin või oma programmi võib võtta kui potentsiaalset.
>> Alustame järgnevalt.
Esiteks olgem tunnistada meie string, muidu tuntud nüüd char star,
ja nimetavad seda s.
Lets järgmine kiire kasutaja jaoks string, Nagu "string palun." Ja
olgem nüüd saan stringi kasutaja kasutades scanf, tsitaat lõppeb, "% s." Sisse
Teisisõnu, olgem teatama scanf et me ei tegelikult oodata, et saada string
kasutaja.
>> Aga nüüd peame ütlema scanf üks asi -
kuhu panna stringi kasutaja näeb.
Noh, ma lähen lihtsalt alustada komadega s, täpsustades, et ma tahaks
scanf panna string seal.
Ma järgmine läheb välja trükkida midagi nagu printf "thanks for% s
kurakriips n koma. "Ja nagu alati, ma olen läheb edasi stringi, s.
Nüüd salvestada, kompileerida ja käivitada programmi, ja vaata, kui me ei saa esile kutsuda
probleem ma ennustasin.
>> Tee scanf-1.
./scanf-1.
String palun.
Anname midagi, "tere". "Aitäh null." Hmm, see ei ole
mida ma ootasin.
Mis siis siin toimub?
>> Noh, tuli välja, sest me kuulutasime s kui char star kuid me ei
tegelikult salvestatud s aadress tegelik tüki mälu, scanf ei
on kuhugi panna string et kasutaja sisestatud sisse
Tõepoolest, kui kasutaja oli nüüd kirjuta palju pikem string kui "tere"
näiteks mitu rida teksti või mitu lõiku teksti, see on üsna
Võimalik, et me võiksime kutsuda esile nn killustatust süü.
>> Kuna scanf ei kavatse teame, et Ma ei ole tegelikult panna aadress
sees s.
Pigem see läheb, et näha mõned raha s, mõned muster bitti, mis võivad
väga hästi olla prügi väärtus, seal lihtsalt juhus.
Ja scanf ikka üritan kirjutada kasutaja string sellele aadressile,
isegi kui see on prügi väärtus, mis võib tõepoolest esile kutsuda crash.
>> Niisiis, kuidas me saame seda parandada?