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?