1 00:00:00,000 --> 00:00:00,180 2 00:00:00,180 --> 00:00:02,920 >> ZVUČNIK 1: Idemo napisati program koji dobiva niz od korisnika bez 3 00:00:02,920 --> 00:00:05,700 korištenjem CS50 knjižnice funkcionirati GetString. 4 00:00:05,700 --> 00:00:08,720 Da biste to učinili, mi ćemo ići naprijed i koristiti scanf, funkcija koja GetString 5 00:00:08,720 --> 00:00:10,950 funkcija zapravo koristi ispod poklopca motora. 6 00:00:10,950 --> 00:00:13,780 Ali ja ću to učiniti namjerno u buggy način. 7 00:00:13,780 --> 00:00:17,230 Ja ću učiniti na način da mislim će biti u pravu, ali ispada da je 8 00:00:17,230 --> 00:00:19,380 moja pretpostavka je da će biti vrlo, vrlo manjkav. 9 00:00:19,380 --> 00:00:20,800 A u stvari, vrlo opasni. 10 00:00:20,800 --> 00:00:24,750 Zbog greške poput onog što sam o to da može biti iskorišten od strane protivnika 11 00:00:24,750 --> 00:00:28,870 kao da je vaš stroj ili vaš program može se preuzeti potencijalno. 12 00:00:28,870 --> 00:00:30,200 >> Počnimo na sljedeći način. 13 00:00:30,200 --> 00:00:33,540 Prvo ćemo proglasiti našu niz, inače sada poznat kao char zvijezda, 14 00:00:33,540 --> 00:00:34,750 i pozvati ga je. 15 00:00:34,750 --> 00:00:39,400 Omogućuje pored brz korisnik za niz, što je s "nizom molim." I 16 00:00:39,400 --> 00:00:44,250 idemo sada dobiti niz od korisnika pomoću scanf, citat završiti citat, "% s." U 17 00:00:44,250 --> 00:00:47,760 Drugim riječima, neka je obavijestiti scanf tome što mi to je u stvari očekivati ​​da će dobiti niz 18 00:00:47,760 --> 00:00:48,630 od korisnika. 19 00:00:48,630 --> 00:00:50,810 >> Ali sada moramo reći scanf jedna druga stvar - 20 00:00:50,810 --> 00:00:53,350 gdje staviti niz koji Korisnik pruža. 21 00:00:53,350 --> 00:00:57,840 Pa, ja ću jednostavno početi s zarez a, navodeći da bih 22 00:00:57,840 --> 00:00:59,320 scanf staviti string postoji. 23 00:00:59,320 --> 00:01:04,818 Ja sam sljedeći će se ispisati nešto kao printf "hvala za% s 24 00:01:04,818 --> 00:01:10,670 backslash n zarez. "I kao i uvijek, ja sam će proći u nizu, S. 25 00:01:10,670 --> 00:01:14,920 Sada ćemo uštedjeti, sastaviti i pokrenuti ovaj Program, i vidjeti ako mi ne može izazvati 26 00:01:14,920 --> 00:01:16,590 Problem sam predvidio. 27 00:01:16,590 --> 00:01:18,650 >> Provjerite scanf-1. 28 00:01:18,650 --> 00:01:20,960 ./scanf-1. 29 00:01:20,960 --> 00:01:21,830 String molimo. 30 00:01:21,830 --> 00:01:25,540 Idemo dati nešto poput "Zdravo." "Hvala na nulu." Hmm, to nije 31 00:01:25,540 --> 00:01:26,750 ono što sam očekivao. 32 00:01:26,750 --> 00:01:28,240 Dakle, ono što se ovdje događa? 33 00:01:28,240 --> 00:01:32,040 >> Pa, ispada jer smo proglasili e kao char zvijezda, ali nismo 34 00:01:32,040 --> 00:01:36,120 zapravo pohranjeni u e adresu Stvarni komad memorije, scanf nije 35 00:01:36,120 --> 00:01:38,940 imala gdje staviti uzicu da korisnik unese 36 00:01:38,940 --> 00:01:42,510 Doista, ako je korisnik bila bi sad upisati mnogo dulje nego string "Hello" 37 00:01:42,510 --> 00:01:46,780 za primjer nekoliko redaka teksta ili nekoliko paragrafa teksta, to je sasvim 38 00:01:46,780 --> 00:01:50,280 moguće da smo mogli izazvati Takozvani segmentacije kriv. 39 00:01:50,280 --> 00:01:53,570 >> Zbog scanf neće znati da je Nisam zapravo staviti adresu 40 00:01:53,570 --> 00:01:54,610 unutar s.. 41 00:01:54,610 --> 00:01:58,000 Umjesto toga, to će se vidjeti neke vrijednosti u S, neki uzorak bitova koji mogu 42 00:01:58,000 --> 00:02:00,910 vrlo dobro se vrijednost smeća, postoji samo slučajno. 43 00:02:00,910 --> 00:02:04,600 I scanf dalje će pokušati napisati Korisnik string na tu adresu, 44 00:02:04,600 --> 00:02:08,789 čak i ako je vrijednost smeće, koje doista mogao izazvati sudar. 45 00:02:08,789 --> 00:02:10,130 >> Pa kako ćemo to popraviti? 46 00:02:10,130 --> 00:02:12,523