>> ZVUČNIK 1: Idemo napisati program koji dobiva niz od korisnika bez
korištenjem CS50 knjižnice funkcionirati GetString.
Da biste to učinili, mi ćemo ići naprijed i koristiti scanf, funkcija koja GetString
funkcija zapravo koristi ispod poklopca motora.
Ali ja ću to učiniti namjerno u buggy način.
Ja ću učiniti na način da mislim će biti u pravu, ali ispada da je
moja pretpostavka je da će biti vrlo, vrlo manjkav.
A u stvari, vrlo opasni.
Zbog greške poput onog što sam o to da može biti iskorišten od strane protivnika
kao da je vaš stroj ili vaš program može se preuzeti potencijalno.
>> Počnimo na sljedeći način.
Prvo ćemo proglasiti našu niz, inače sada poznat kao char zvijezda,
i pozvati ga je.
Omogućuje pored brz korisnik za niz, što je s "nizom molim." I
idemo sada dobiti niz od korisnika pomoću scanf, citat završiti citat, "% s." U
Drugim riječima, neka je obavijestiti scanf tome što mi to je u stvari očekivati ​​da će dobiti niz
od korisnika.
>> Ali sada moramo reći scanf jedna druga stvar -
gdje staviti niz koji Korisnik pruža.
Pa, ja ću jednostavno početi s zarez a, navodeći da bih
scanf staviti string postoji.
Ja sam sljedeći će se ispisati nešto kao printf "hvala za% s
backslash n zarez. "I kao i uvijek, ja sam će proći u nizu, S.
Sada ćemo uštedjeti, sastaviti i pokrenuti ovaj Program, i vidjeti ako mi ne može izazvati
Problem sam predvidio.
>> Provjerite scanf-1.
./scanf-1.
String molimo.
Idemo dati nešto poput "Zdravo." "Hvala na nulu." Hmm, to nije
ono što sam očekivao.
Dakle, ono što se ovdje događa?
>> Pa, ispada jer smo proglasili e kao char zvijezda, ali nismo
zapravo pohranjeni u e adresu Stvarni komad memorije, scanf nije
imala gdje staviti uzicu da korisnik unese
Doista, ako je korisnik bila bi sad upisati mnogo dulje nego string "Hello"
za primjer nekoliko redaka teksta ili nekoliko paragrafa teksta, to je sasvim
moguće da smo mogli izazvati Takozvani segmentacije kriv.
>> Zbog scanf neće znati da je Nisam zapravo staviti adresu
unutar s..
Umjesto toga, to će se vidjeti neke vrijednosti u S, neki uzorak bitova koji mogu
vrlo dobro se vrijednost smeća, postoji samo slučajno.
I scanf dalje će pokušati napisati Korisnik string na tu adresu,
čak i ako je vrijednost smeće, koje doista mogao izazvati sudar.
>> Pa kako ćemo to popraviti?