>> Spreker 1: Kom ons skryf 'n program wat kry 'n string van die gebruiker sonder
gebruik van die CS50 Biblioteek se funksioneer GetString.
Om dit te doen, sal ons gaan voort en gebruik scanf, die funksie wat die GetString
funksie eintlik gebruik onder die kap.
Maar ek gaan om dit te doen nie doelbewus in 'n karretjie manier.
Ek gaan om te doen op 'n manier wat ek dink sou reg wees, maar dit blyk dat
my aanname gaan heel, heel gebrekkig.
En in werklikheid, baie gevaarlik.
Omdat foute soos die een wat ek nou gaan maak kan uitgebuit word deur teenstanders
sodanig dat jou rekenaar of program kan oor potensieel geneem word.
>> Kom ons begin soos volg.
Eerste laat se verklaar ons string, andersins nou bekend as 'n kar-ster,
en noem dit is.
Kom ons langs die gebruiker vir 'n string gevra, as met 'n "string asseblief." En
Kom ons kyk nou kry die string van die gebruiker gebruik scanf, kwotasie unquote, "% s." In
ander woorde, laat ons inlig dat ons scanf wel verwag dat 'n string te kry
van die gebruiker.
>> Maar nou moet ons scanf te vertel 'n ander ding -
waar die tou te sit wat die gebruiker bied.
Wel, ek gaan eenvoudig begin met komma s, spesifiseer dat ek wil
scanf die string daar te vestig.
Ek is volgende gaan druk om iets soos printf "Dankie vir die% s
backslash n komma. "En soos altyd, ek is gaan in die tou, S te slaag.
Nou laat spaar, saamstel, en die uitvoering van hierdie program, en kyk of ons nie kan veroorsaak
Die probleem wat ek voorspel.
>> Maak scanf-1.
./scanf-1.
String asseblief.
Kom ons gee iets soos, "hallo." "Dankie vir die nul." Hmm, dit is nie
wat ek verwag het.
So, wat gaan hier aan?
>> Wel, dit blyk, want ons verklaar s as 'n kar sterre, maar ons het nie
eintlik gestoor in s die adres van 'n werklike stuk van die geheue, scanf het nie
het oral die string te sit dat die gebruiker getik in
Inderdaad, as die gebruiker is nou tik in 'n baie langer string as "hallo"
byvoorbeeld 'n paar lyne van die teks of paar paragrawe van die teks, is dit baie
moontlik dat ons dalk veroorsaak 'n sogenaamde segmentering skuld.
>> Omdat scanf is nie van plan om te weet dat Ek het nie eintlik sit 'n adres
binnekant van s.
Inteendeel, dit gaan 'n bietjie waarde te sien in s, 'n patroon van stukkies wat kan
baie goed wees om 'n gemors waarde, daar net per toeval.
En scanf is nog aan die gang te probeer om te skryf die gebruiker string na die adres,
selfs al is dit 'n gemors waarde, wat kan inderdaad veroorsaak 'n ongeluk.
>> So hoe gaan ons dit op te los?