1 00:00:00,000 --> 00:00:00,180 2 00:00:00,180 --> 00:00:02,920 >> SPEAKER 1: Lad os skrive et program, får en snor fra brugeren uden 3 00:00:02,920 --> 00:00:05,700 ved hjælp af CS50 Biblioteks fungere getString. 4 00:00:05,700 --> 00:00:08,720 For at gøre dette, vil vi gå videre og bruge scanf, den funktion, at den getString 5 00:00:08,720 --> 00:00:10,950 Funktionen bruger faktisk under hætten. 6 00:00:10,950 --> 00:00:13,780 Men jeg har tænkt mig at gøre dette bevidst i en fejlbehæftet måde. 7 00:00:13,780 --> 00:00:17,230 Jeg har tænkt mig at gøre på en måde, som jeg tror ville være rigtigt, men det viser sig, at 8 00:00:17,230 --> 00:00:19,380 min antagelse kommer til at være helt, helt forkert. 9 00:00:19,380 --> 00:00:20,800 Og faktisk ganske farlig. 10 00:00:20,800 --> 00:00:24,750 Fordi bugs som den jeg er ved at gøre kan udnyttes af modstandere 11 00:00:24,750 --> 00:00:28,870 sådan, at din maskine eller dit program kan overtages potentielt. 12 00:00:28,870 --> 00:00:30,200 >> Lad os begynde som følger. 13 00:00:30,200 --> 00:00:33,540 Først lad os erklære vores streng, ellers kendt nu som en char stjerne, 14 00:00:33,540 --> 00:00:34,750 og kalder det er. 15 00:00:34,750 --> 00:00:39,400 Lader næste bede brugeren om en streng, som med "streng venligst." Og 16 00:00:39,400 --> 00:00:44,250 lad os nu få snoren fra brugeren bruge scanf, citat citat slut, "% s". I 17 00:00:44,250 --> 00:00:47,760 andre ord, lad os meddele scanf at vi rent faktisk forventer at få en streng 18 00:00:47,760 --> 00:00:48,630 fra brugeren. 19 00:00:48,630 --> 00:00:50,810 >> Men nu er vi nødt til at fortælle scanf en anden ting - 20 00:00:50,810 --> 00:00:53,350 hvor til at sætte den streng, brugeren giver. 21 00:00:53,350 --> 00:00:57,840 Nå, jeg har tænkt mig at ganske enkelt at starte med komma s, præciserer, at jeg gerne vil 22 00:00:57,840 --> 00:00:59,320 scanf at sætte strengen der. 23 00:00:59,320 --> 00:01:04,818 Jeg næste kommer til at udskrive noget ligesom printf "tak for% s 24 00:01:04,818 --> 00:01:10,670 backslash n komma ". Og som altid, er jeg vil passere i strengen, s. 25 00:01:10,670 --> 00:01:14,920 Lad os nu gemme, kompilere og køre dette program, og se om vi ikke kan fremkalde 26 00:01:14,920 --> 00:01:16,590 det problem, jeg forudsagde. 27 00:01:16,590 --> 00:01:18,650 >> Make scanf-1. 28 00:01:18,650 --> 00:01:20,960 ./scanf-1. 29 00:01:20,960 --> 00:01:21,830 String tak. 30 00:01:21,830 --> 00:01:25,540 Lad os give noget lignende, "hej." "Tak for null." Hmm, det er ikke 31 00:01:25,540 --> 00:01:26,750 hvad jeg havde forventet. 32 00:01:26,750 --> 00:01:28,240 Så hvad sker der her? 33 00:01:28,240 --> 00:01:32,040 >> Tja, det viser sig, fordi vi erklærede s som en char stjerne, men det gjorde vi ikke 34 00:01:32,040 --> 00:01:36,120 faktisk er gemt i e adressen på en faktiske luns af hukommelse, scanf ikke 35 00:01:36,120 --> 00:01:38,940 har et sted at sætte strengen at brugeren skrevet i. 36 00:01:38,940 --> 00:01:42,510 Ja, hvis brugeren skulle nu skrive en meget længere snor end "hello" 37 00:01:42,510 --> 00:01:46,780 for eksempel flere linjer af tekst eller flere tekstafsnit, det er ganske 38 00:01:46,780 --> 00:01:50,280 muligt, at vi kan fremkalde en såkaldt segmenteringsfejl. 39 00:01:50,280 --> 00:01:53,570 >> Fordi scanf ikke kommer til at vide, at Jeg har faktisk ikke sætte en adresse 40 00:01:53,570 --> 00:01:54,610 indersiden af ​​s. 41 00:01:54,610 --> 00:01:58,000 Snarere er det kommer til at se en vis værdi i s, nogle mønster af bits, der kan 42 00:01:58,000 --> 00:02:00,910 meget vel være en skraldespand værdi, der bare tilfældigt. 43 00:02:00,910 --> 00:02:04,600 Og scanf stadig vil forsøge at skrive brugeren streng til denne adresse, 44 00:02:04,600 --> 00:02:08,789 selv om det er en skraldespand værdi, hvilket kunne faktisk fremkalde et styrt. 45 00:02:08,789 --> 00:02:10,130 >> Så hvordan skal vi løse dette? 46 00:02:10,130 --> 00:02:12,523