>> SPEAKER 1: La oss skrive et program som får en streng fra brukeren uten
bruker CS50 Bibliotekets fungere GetString.
For å gjøre dette, vil vi gå videre og bruke scanf, funksjonen som GetString
Funksjonen bruker faktisk under panseret.
Men jeg kommer til å gjøre dette bevisst i en buggy måte.
Jeg kommer til å gjøre på en måte som jeg tror ville være riktig, men det viser seg at
min antagelse kommer til å være ganske, ganske feil.
Og faktisk ganske farlig.
Fordi bugs som den jeg er i ferd med å gjør kan bli utnyttet av motstandere
slik at din maskin eller ditt program kan bli tatt over potensielt.
>> La oss begynne slik.
Først la oss erklære vår streng, ellers kjent nå som en char stjerne,
og kaller det er.
Lar neste be brukeren for en streng, som med "streng takk." Og
la oss nå få strengen fra brukeren bruker scanf, sitat unquote, "% s". I
Med andre ord, la oss informere scanf at vi gjør faktisk forvente å få en streng
fra brukeren.
>> Men nå trenger vi å fortelle scanf en annen ting -
hvor du skal sette strengen som brukeren gir.
Vel, jeg skal rett og slett starte med komma s, som spesifiserer at jeg ønsker
scanf å sette strengen der.
Jeg neste kommer til å skrive ut noe som printf "takk for% s
backslash n komma. "Og som alltid, jeg er kommer til å passere i strengen, s.
Nå la oss redde, kompilere og kjøre denne program, og se om vi ikke kan indusere
problemet jeg spådde.
>> Gjør scanf-en.
./scanf-1.
String takk.
La oss gi noe sånt som "hallo". "Takk for null." Hmm, det er ikke
hva jeg hadde ventet.
Så hva er det som skjer her?
>> Vel, det viser seg at vi erklærte s som en char stjerne, men vi gjorde ikke
faktisk er lagret i s adressen til en faktiske mengde minne, gjorde ikke scanf
har noe sted å sette strengen at brukeren har skrevet i.
Faktisk, dersom brukeren skulle nå skrive i en mye lengre streng enn "hei,"
for eksempel flere linjer med tekst eller flere avsnitt med tekst, er det ganske
mulig at vi kan overtale en såkalte segmenteringsfeil.
>> Fordi scanf ikke kommer til å vite at Jeg har faktisk ikke sette en adresse
innsiden av s.
Snarere, det kommer til å se noen verdi i s, noe mønster av biter som kanskje
meget vel være en søppel verdi, det bare ved en tilfeldighet.
Og scanf er fortsatt kommer til å prøve å skrive brukeren strengen til den adressen,
selv om det er en søppel-verdi, som kan faktisk forårsake en krasj.
>> Så hvordan skal vi løse dette?