1 00:00:00,000 --> 00:00:00,180 2 00:00:00,180 --> 00:00:02,920 >> Spreker 1: Kom ons skryf 'n program wat kry 'n string van die gebruiker sonder 3 00:00:02,920 --> 00:00:05,700 gebruik van die CS50 Biblioteek se funksioneer GetString. 4 00:00:05,700 --> 00:00:08,720 Om dit te doen, sal ons gaan voort en gebruik scanf, die funksie wat die GetString 5 00:00:08,720 --> 00:00:10,950 funksie eintlik gebruik onder die kap. 6 00:00:10,950 --> 00:00:13,780 Maar ek gaan om dit te doen nie doelbewus in 'n karretjie manier. 7 00:00:13,780 --> 00:00:17,230 Ek gaan om te doen op 'n manier wat ek dink sou reg wees, maar dit blyk dat 8 00:00:17,230 --> 00:00:19,380 my aanname gaan heel, heel gebrekkig. 9 00:00:19,380 --> 00:00:20,800 En in werklikheid, baie gevaarlik. 10 00:00:20,800 --> 00:00:24,750 Omdat foute soos die een wat ek nou gaan maak kan uitgebuit word deur teenstanders 11 00:00:24,750 --> 00:00:28,870 sodanig dat jou rekenaar of program kan oor potensieel geneem word. 12 00:00:28,870 --> 00:00:30,200 >> Kom ons begin soos volg. 13 00:00:30,200 --> 00:00:33,540 Eerste laat se verklaar ons string, andersins nou bekend as 'n kar-ster, 14 00:00:33,540 --> 00:00:34,750 en noem dit is. 15 00:00:34,750 --> 00:00:39,400 Kom ons langs die gebruiker vir 'n string gevra, as met 'n "string asseblief." En 16 00:00:39,400 --> 00:00:44,250 Kom ons kyk nou kry die string van die gebruiker gebruik scanf, kwotasie unquote, "% s." In 17 00:00:44,250 --> 00:00:47,760 ander woorde, laat ons inlig dat ons scanf wel verwag dat 'n string te kry 18 00:00:47,760 --> 00:00:48,630 van die gebruiker. 19 00:00:48,630 --> 00:00:50,810 >> Maar nou moet ons scanf te vertel 'n ander ding - 20 00:00:50,810 --> 00:00:53,350 waar die tou te sit wat die gebruiker bied. 21 00:00:53,350 --> 00:00:57,840 Wel, ek gaan eenvoudig begin met komma s, spesifiseer dat ek wil 22 00:00:57,840 --> 00:00:59,320 scanf die string daar te vestig. 23 00:00:59,320 --> 00:01:04,818 Ek is volgende gaan druk om iets soos printf "Dankie vir die% s 24 00:01:04,818 --> 00:01:10,670 backslash n komma. "En soos altyd, ek is gaan in die tou, S te slaag. 25 00:01:10,670 --> 00:01:14,920 Nou laat spaar, saamstel, en die uitvoering van hierdie program, en kyk of ons nie kan veroorsaak 26 00:01:14,920 --> 00:01:16,590 Die probleem wat ek voorspel. 27 00:01:16,590 --> 00:01:18,650 >> Maak scanf-1. 28 00:01:18,650 --> 00:01:20,960 ./scanf-1. 29 00:01:20,960 --> 00:01:21,830 String asseblief. 30 00:01:21,830 --> 00:01:25,540 Kom ons gee iets soos, "hallo." "Dankie vir die nul." Hmm, dit is nie 31 00:01:25,540 --> 00:01:26,750 wat ek verwag het. 32 00:01:26,750 --> 00:01:28,240 So, wat gaan hier aan? 33 00:01:28,240 --> 00:01:32,040 >> Wel, dit blyk, want ons verklaar s as 'n kar sterre, maar ons het nie 34 00:01:32,040 --> 00:01:36,120 eintlik gestoor in s die adres van 'n werklike stuk van die geheue, scanf het nie 35 00:01:36,120 --> 00:01:38,940 het oral die string te sit dat die gebruiker getik in 36 00:01:38,940 --> 00:01:42,510 Inderdaad, as die gebruiker is nou tik in 'n baie langer string as "hallo" 37 00:01:42,510 --> 00:01:46,780 byvoorbeeld 'n paar lyne van die teks of paar paragrawe van die teks, is dit baie 38 00:01:46,780 --> 00:01:50,280 moontlik dat ons dalk veroorsaak 'n sogenaamde segmentering skuld. 39 00:01:50,280 --> 00:01:53,570 >> Omdat scanf is nie van plan om te weet dat Ek het nie eintlik sit 'n adres 40 00:01:53,570 --> 00:01:54,610 binnekant van s. 41 00:01:54,610 --> 00:01:58,000 Inteendeel, dit gaan 'n bietjie waarde te sien in s, 'n patroon van stukkies wat kan 42 00:01:58,000 --> 00:02:00,910 baie goed wees om 'n gemors waarde, daar net per toeval. 43 00:02:00,910 --> 00:02:04,600 En scanf is nog aan die gang te probeer om te skryf die gebruiker string na die adres, 44 00:02:04,600 --> 00:02:08,789 selfs al is dit 'n gemors waarde, wat kan inderdaad veroorsaak 'n ongeluk. 45 00:02:08,789 --> 00:02:10,130 >> So hoe gaan ons dit op te los? 46 00:02:10,130 --> 00:02:12,523