>> SPEAKER 1: Kirjoitetaan ohjelma, joka saa merkkijonon käyttäjä ilman
käyttäen CS50 kirjaston toimiakseen getString.
Voit tehdä tämän, me menemme eteenpäin ja käyttää scanf, toiminto, joka getString
toiminto itse asiassa käyttää alla huppu.
Mutta aion tehdä tämän tarkoituksella in buginen tavalla.
Aion tehdä tavalla, joka mielestäni olisi oikea, mutta käy ilmi, että
oletan tulee olla varsin, varsin puutteellinen.
Ja itse asiassa aika vaarallista.
Koska vikoja jollainen olen aikeissa Merkki voidaan hyödyntää vastustajien
siten, että koneesi tai ohjelmaan voidaan hyväksyä mahdollisesti.
>> Aloitetaan seuraavasti.
Katsotaanpa ensin julistamme merkkijono, joka tunnetaan nyt char tähti,
ja kutsua sitä s.
Lets vieressä pyytää käyttäjältä merkkijonon, kuten "merkkijono kiitos." Ja
Katsotaanpa nyt saada merkkijonon käyttäjä käyttäen scanf, lainaus lainaus, "% s." Sisään
Toisin sanoen, nyt ilmoittaa scanf että me eivät itse asiassa odottaa saavansa merkkijono
käyttäjältä.
>> Mutta nyt meidän täytyy kertoa scanf yksi muu asia -
mihin merkkijono, joka käyttäjä antaa.
No, aion yksinkertaisesti aloittaa pilkulla s, täsmennetään, että haluaisin
scanf laittaa merkkijonon siellä.
Olen vieressä menossa tulostaa jotain kuten printf "kiitos% s
kenoviiva n pilkku. "Ja kuten aina, olen menossa ohi merkkijonon, s.
Nyt tallentaa, kääntää ja ajaa tämän ohjelma, ja katso jos emme voi aiheuttaa
ongelma minulla ennusti.
>> Tee scanf-1.
./scanf-1.
String kiitos.
Katsotaanpa tarjota jotain, "Hei." "Kiitos null." Hmm, se ei ole
mitä odotin.
Joten mitä täällä tapahtuu?
>> No, se kääntyy pois, koska me julisti s char tähden mutta emme
tosiasiallisesti varastoitu s osoite todellinen kimpale muisti, scanf ei
ole paikkaa laittaa merkkijonon että käyttäjän kirjoitetaan sisään
Itse asiassa, jos käyttäjä oli nyt kirjoittaa paljon pidempi merkkijono kuin "hei"
esimerkiksi useita rivejä tekstiä tai useita kappaleita tekstiä, se on melko
mahdollista, että voisimme aiheuttaa ns segmentointi vika.
>> Koska scanf ei tule tietää, että En ole itse laittaa osoitteen
sisällä s.
Pikemminkin se tulee nähdä jotain arvoa s, jotkut malli bittien voi
hyvinkin olla roskat arvo, siellä vain sattumalta.
Ja scanf on vielä menossa yrittää kirjoittaa Käyttäjä merkkijono kyseiseen osoitteeseen,
vaikka se on roskaa arvo, joka voisi todellakin aiheuttaa kaatumisen.
>> Joten miten aiomme korjata tämän?