1 00:00:00,000 --> 00:00:00,180 2 00:00:00,180 --> 00:00:02,920 >> Tagapagsalita 1: magsulat ng isang programa Hayaan na ay makakakuha ng isang string mula sa gumagamit na ang walang 3 00:00:02,920 --> 00:00:05,700 gamit ang CS50 Library ni gumana GetString. 4 00:00:05,700 --> 00:00:08,720 Upang gawin ito, aming sige at gamitin scanf, ang pag-andar na ang GetString 5 00:00:08,720 --> 00:00:10,950 function na aktwal na gumagamit ng sa ilalim ng hood. 6 00:00:10,950 --> 00:00:13,780 Ngunit Pupunta ako upang gawin ito sadyang sa isang maraming surot paraan. 7 00:00:13,780 --> 00:00:17,230 Pupunta ako sa gawin sa isang paraan na sa tingin ko magiging karapatan, ngunit ito ay lumiliko out na 8 00:00:17,230 --> 00:00:19,380 aking palagay pupuntahan lubos na, medyo flawed. 9 00:00:19,380 --> 00:00:20,800 At sa katunayan, masyadong mapanganib. 10 00:00:20,800 --> 00:00:24,750 Dahil ang mga bug tulad ng ako tungkol sa gumawa ay maaaring pinagsamantalahan sa pamamagitan ng adversaries 11 00:00:24,750 --> 00:00:28,870 tulad na ang iyong machine o sa iyong programa Maaari ay dadalhin sa paglipas ng potensyal. 12 00:00:28,870 --> 00:00:30,200 >> Ni magsimula gaya ng sumusunod Hayaan. 13 00:00:30,200 --> 00:00:33,540 Ipinahahayag ng aming mga string Unang ipaalam, kung hindi man ay kilala na ngayon bilang isang pansamantalang trabaho bituin, 14 00:00:33,540 --> 00:00:34,750 at tawagan ito ay s. 15 00:00:34,750 --> 00:00:39,400 Hinahayaan-prompt sa tabi ng gumagamit para sa isang string, bilang may "string mangyaring." At 16 00:00:39,400 --> 00:00:44,250 sabihin na ngayon makuha ang string mula sa gumagamit na ang gamit scanf, quote magpanipi, "% s." Sa 17 00:00:44,250 --> 00:00:47,760 madaling salita, ni ipaalam scanf na namin sa ko sa katunayan inaasahan upang makakuha ng isang string 18 00:00:47,760 --> 00:00:48,630 mula sa user. 19 00:00:48,630 --> 00:00:50,810 >> Ngunit ngayon kailangan namin upang sabihin sa scanf isa iba pang mga bagay - 20 00:00:50,810 --> 00:00:53,350 kung saan upang ilagay ang string na Nagbibigay ang user. 21 00:00:53,350 --> 00:00:57,840 Well, ako ng pagpunta sa simulan medyo simple may comma s, na tumutukoy na gusto ko 22 00:00:57,840 --> 00:00:59,320 scanf upang ilagay ang string doon. 23 00:00:59,320 --> 00:01:04,818 Susunod na pupuntahan ko i-print ang isang bagay tulad ng printf "salamat para sa% s 24 00:01:04,818 --> 00:01:10,670 backslash n kuwit. "At tulad ng dati, ako pagpunta sa pumasa sa string, s. 25 00:01:10,670 --> 00:01:14,920 Ngayon i-save ipaalam, sumulat ng libro, at patakbuhin ito programa, at makita kung hindi namin maaaring magbuod 26 00:01:14,920 --> 00:01:16,590 ang problema hinulaang ko. 27 00:01:16,590 --> 00:01:18,650 >> Gumawa ng scanf-1. 28 00:01:18,650 --> 00:01:20,960 ./scanf-1. 29 00:01:20,960 --> 00:01:21,830 String mangyaring. 30 00:01:21,830 --> 00:01:25,540 Magbigay ng isang bagay tulad ng, Hayaan ang "kumusta." "Salamat para sa null." Hmm, hindi iyon 31 00:01:25,540 --> 00:01:26,750 kung ano ang inaasahan ko. 32 00:01:26,750 --> 00:01:28,240 Kaya kung ano ang nangyayari sa dito? 33 00:01:28,240 --> 00:01:32,040 >> Well, ito ay lumiliko out dahil ipinahayag namin s bilang isang pansamantalang trabaho bituin ngunit kami ay hindi 34 00:01:32,040 --> 00:01:36,120 talagang naka-imbak s sa address ng isang aktwal na tipak ng memory, scanf ginawang hindi 35 00:01:36,120 --> 00:01:38,940 mayroon kahit saan upang ilagay ang string na ang mga gumagamit na nai-type in 36 00:01:38,940 --> 00:01:42,510 Sa katunayan, kung ang gumagamit ay sa ngayon i-type ang isang mas matagal kaysa string "kumusta," 37 00:01:42,510 --> 00:01:46,780 halimbawa ng ilang mga linya ng teksto o ilang talata ng teksto, ito ay medyo 38 00:01:46,780 --> 00:01:50,280 posible na maaari naming magbuod isang tinatawag nang gayon segmentation fault. 39 00:01:50,280 --> 00:01:53,570 >> Dahil scanf ay hindi pagpunta sa malaman na Hindi ko pa talaga maglagay ng isang address 40 00:01:53,570 --> 00:01:54,610 sa loob ng s. 41 00:01:54,610 --> 00:01:58,000 Sa halip, ito ay pagpunta upang makita ang ilang halaga sa s, ang ilang mga pattern ng mga piraso na maaari 42 00:01:58,000 --> 00:02:00,910 napakahusay maging isang halaga ng basura, doon sa pamamagitan lamang ng pagkakataon. 43 00:02:00,910 --> 00:02:04,600 At scanf Pupunta pa rin upang subukang magsulat ang string ng user sa address na iyon, 44 00:02:04,600 --> 00:02:08,789 kahit na ito ay isang halaga na basura, na maaaring sa katunayan magbuod ng pag-crash. 45 00:02:08,789 --> 00:02:10,130 >> Kaya paano kami makapupunta sa ayusin ito? 46 00:02:10,130 --> 00:02:12,523