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