1 00:00:00,000 --> 00:00:00,180 2 00:00:00,180 --> 00:00:02,920 >> SPEAKER 1: La oss skrive et program som får en streng fra brukeren uten 3 00:00:02,920 --> 00:00:05,700 bruker CS50 Bibliotekets fungere GetString. 4 00:00:05,700 --> 00:00:08,720 For å gjøre dette, vil vi gå videre og bruke scanf, funksjonen som GetString 5 00:00:08,720 --> 00:00:10,950 Funksjonen bruker faktisk under panseret. 6 00:00:10,950 --> 00:00:13,780 Men jeg kommer til å gjøre dette bevisst i en buggy måte. 7 00:00:13,780 --> 00:00:17,230 Jeg kommer til å gjøre på en måte som jeg tror ville være riktig, men det viser seg at 8 00:00:17,230 --> 00:00:19,380 min antagelse kommer til å være ganske, ganske feil. 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 i ferd med å gjør kan bli utnyttet av motstandere 11 00:00:24,750 --> 00:00:28,870 slik at din maskin eller ditt program kan bli tatt over potensielt. 12 00:00:28,870 --> 00:00:30,200 >> La oss begynne slik. 13 00:00:30,200 --> 00:00:33,540 Først la oss erklære vår streng, ellers kjent nå som en char stjerne, 14 00:00:33,540 --> 00:00:34,750 og kaller det er. 15 00:00:34,750 --> 00:00:39,400 Lar neste be brukeren for en streng, som med "streng takk." Og 16 00:00:39,400 --> 00:00:44,250 la oss nå få strengen fra brukeren bruker scanf, sitat unquote, "% s". I 17 00:00:44,250 --> 00:00:47,760 Med andre ord, la oss informere scanf at vi gjør faktisk forvente å få en streng 18 00:00:47,760 --> 00:00:48,630 fra brukeren. 19 00:00:48,630 --> 00:00:50,810 >> Men nå trenger vi å fortelle scanf en annen ting - 20 00:00:50,810 --> 00:00:53,350 hvor du skal sette strengen som brukeren gir. 21 00:00:53,350 --> 00:00:57,840 Vel, jeg skal rett og slett starte med komma s, som spesifiserer at jeg ønsker 22 00:00:57,840 --> 00:00:59,320 scanf å sette strengen der. 23 00:00:59,320 --> 00:01:04,818 Jeg neste kommer til å skrive ut noe som printf "takk for% s 24 00:01:04,818 --> 00:01:10,670 backslash n komma. "Og som alltid, jeg er kommer til å passere i strengen, s. 25 00:01:10,670 --> 00:01:14,920 Nå la oss redde, kompilere og kjøre denne program, og se om vi ikke kan indusere 26 00:01:14,920 --> 00:01:16,590 problemet jeg spådde. 27 00:01:16,590 --> 00:01:18,650 >> Gjør scanf-en. 28 00:01:18,650 --> 00:01:20,960 ./scanf-1. 29 00:01:20,960 --> 00:01:21,830 String takk. 30 00:01:21,830 --> 00:01:25,540 La oss gi noe sånt som "hallo". "Takk for null." Hmm, det er ikke 31 00:01:25,540 --> 00:01:26,750 hva jeg hadde ventet. 32 00:01:26,750 --> 00:01:28,240 Så hva er det som skjer her? 33 00:01:28,240 --> 00:01:32,040 >> Vel, det viser seg at vi erklærte s som en char stjerne, men vi gjorde ikke 34 00:01:32,040 --> 00:01:36,120 faktisk er lagret i s adressen til en faktiske mengde minne, gjorde ikke scanf 35 00:01:36,120 --> 00:01:38,940 har noe sted å sette strengen at brukeren har skrevet i. 36 00:01:38,940 --> 00:01:42,510 Faktisk, dersom brukeren skulle nå skrive i en mye lengre streng enn "hei," 37 00:01:42,510 --> 00:01:46,780 for eksempel flere linjer med tekst eller flere avsnitt med tekst, er det ganske 38 00:01:46,780 --> 00:01:50,280 mulig at vi kan overtale en såkalte segmenteringsfeil. 39 00:01:50,280 --> 00:01:53,570 >> Fordi scanf ikke kommer til å vite at Jeg har faktisk ikke sette en adresse 40 00:01:53,570 --> 00:01:54,610 innsiden av s. 41 00:01:54,610 --> 00:01:58,000 Snarere, det kommer til å se noen verdi i s, noe mønster av biter som kanskje 42 00:01:58,000 --> 00:02:00,910 meget vel være en søppel verdi, det bare ved en tilfeldighet. 43 00:02:00,910 --> 00:02:04,600 Og scanf er fortsatt kommer til å prøve å skrive brukeren strengen til den adressen, 44 00:02:04,600 --> 00:02:08,789 selv om det er en søppel-verdi, som kan faktisk forårsake en krasj. 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