1 00:00:00,000 --> 00:00:00,180 2 00:00:00,180 --> 00:00:02,920 >> SPEAKER 1: Napišimo program, ki dobi niz od uporabnika brez 3 00:00:02,920 --> 00:00:05,700 uporabo CS50 Knjižnica je delovanje GetString. 4 00:00:05,700 --> 00:00:08,720 Da bi to naredili, bomo šli naprej in uporabo scanf, funkcija, ki GetString 5 00:00:08,720 --> 00:00:10,950 funkcija dejansko uporablja Pod pokrovom. 6 00:00:10,950 --> 00:00:13,780 Ampak bom to naredil namerno v buggy način. 7 00:00:13,780 --> 00:00:17,230 Jaz bom naredil tako, da mislim, bi bilo prav, vendar se izkaže, da 8 00:00:17,230 --> 00:00:19,380 Moja predpostavka se dogaja, da precej, precej pomanjkljiva. 9 00:00:19,380 --> 00:00:20,800 In dejansko zelo nevarna. 10 00:00:20,800 --> 00:00:24,750 Ker hroščev, kot tisti, sem približno da bi bilo mogoče izkoristiti z nasprotniki 11 00:00:24,750 --> 00:00:28,870 , tako da je vaš računalnik ali vaš program lahko prevzamejo potencialno. 12 00:00:28,870 --> 00:00:30,200 >> Začnimo takole. 13 00:00:30,200 --> 00:00:33,540 Najprej si izrekamo niz, sicer znan že kot char zvezde, 14 00:00:33,540 --> 00:00:34,750 in poklicati to je to. 15 00:00:34,750 --> 00:00:39,400 Lets naslednji poziv uporabniku za vrvico, kot z "vrvico, prosim." In 16 00:00:39,400 --> 00:00:44,250 dajmo zdaj dobili niz od uporabnika uporabo scanf, citiram konec citata, "% s". V 17 00:00:44,250 --> 00:00:47,760 Z drugimi besedami, kaj je obvestiti scanf tem smo pa v resnici pričakujejo, da bodo dobili niz 18 00:00:47,760 --> 00:00:48,630 od uporabnika. 19 00:00:48,630 --> 00:00:50,810 >> Toda zdaj se moramo povedati scanf še ena stvar - 20 00:00:50,810 --> 00:00:53,350 kje postaviti niz, ki uporabniku omogoča. 21 00:00:53,350 --> 00:00:57,840 No, bom preprosto začeti z vejico s, z navedbo, da bi rad 22 00:00:57,840 --> 00:00:59,320 scanf postaviti niz tam. 23 00:00:59,320 --> 00:01:04,818 Jaz sem zraven bo izpisal nekaj kot "Hvala printf za% s 24 00:01:04,818 --> 00:01:10,670 backslash n vejico. "In kot vedno, sem tekoč prehod v nizu, s. 25 00:01:10,670 --> 00:01:14,920 Zdaj pa shranite, pripravijo in vodijo to programa, in videli, če mi ne more voditi 26 00:01:14,920 --> 00:01:16,590 Problem sem napovedal. 27 00:01:16,590 --> 00:01:18,650 >> Naredite scanf-1. 28 00:01:18,650 --> 00:01:20,960 ./scanf-1. 29 00:01:20,960 --> 00:01:21,830 String prosim. 30 00:01:21,830 --> 00:01:25,540 Oglejmo zagotoviti nekaj podobnega, "zdravo". "Hvala za nič." Hmm, to ni 31 00:01:25,540 --> 00:01:26,750 tisto, kar sem pričakoval. 32 00:01:26,750 --> 00:01:28,240 Torej, kaj se dogaja? 33 00:01:28,240 --> 00:01:32,040 >> No, izkazalo se je, ker smo se razglasi i kot char zvezdo, vendar nismo 34 00:01:32,040 --> 00:01:36,120 dejansko shranjeni na e naslov Dejanska kos pomnilnika, scanf ni 35 00:01:36,120 --> 00:01:38,940 Nikamor postaviti niz da uporabnik vtipka 36 00:01:38,940 --> 00:01:42,510 Dejansko, če bi uporabnik za zdaj vnesti precej daljši niz kot "zdravo" 37 00:01:42,510 --> 00:01:46,780 na primer več vrstic besedila ali več odstavkov besedila, je precej 38 00:01:46,780 --> 00:01:50,280 možno, da povzročimo ti segmentacija napaka. 39 00:01:50,280 --> 00:01:53,570 >> Ker je scanf ne bo vedel, da je Nisem pravzaprav dal naslov 40 00:01:53,570 --> 00:01:54,610 znotraj s. 41 00:01:54,610 --> 00:01:58,000 Namesto, da se dogaja, da vidim nekaj vrednosti v S, nekateri vzorec bitov, ki lahko 42 00:01:58,000 --> 00:02:00,910 Zelo dobro je smeti vrednost, tam samo po naključju. 43 00:02:00,910 --> 00:02:04,600 In scanf je še vedno tekoč, da bi poskušali napisati Uporabnik niz na ta naslov, 44 00:02:04,600 --> 00:02:08,789 tudi če je vrednost smeti, ki lahko dejansko sprožijo nesrečo. 45 00:02:08,789 --> 00:02:10,130 >> Torej, kako bomo to popraviti? 46 00:02:10,130 --> 00:02:12,523