Tagapagsalita 1: magsulat ng isang programa Hayaan na ay makakakuha ng isang string mula sa gumagamit na ang walang gamit ang CS50 Library ni gumana GetString. Upang gawin ito, aming sige at gamitin scanf, ang pag-andar na ang GetString function na aktwal na gumagamit ng sa ilalim ng hood. Ngunit Pupunta ako upang gawin ito sadyang sa isang maraming surot paraan. Pupunta ako sa gawin sa isang paraan na sa tingin ko magiging karapatan, ngunit ito ay lumiliko out na aking palagay pupuntahan lubos na, medyo flawed. At sa katunayan, masyadong mapanganib. Dahil ang mga bug tulad ng ako tungkol sa gumawa ay maaaring pinagsamantalahan sa pamamagitan ng adversaries tulad na ang iyong machine o sa iyong programa Maaari ay dadalhin sa paglipas ng potensyal. Ni magsimula gaya ng sumusunod Hayaan. Ipinahahayag ng aming mga string Unang ipaalam, kung hindi man ay kilala na ngayon bilang isang pansamantalang trabaho bituin, at tawagan ito ay s. Hinahayaan-prompt sa tabi ng gumagamit para sa isang string, bilang may "string mangyaring." At sabihin na ngayon makuha ang string mula sa gumagamit na ang gamit scanf, quote magpanipi, "% s." Sa madaling salita, ni ipaalam scanf na namin sa ko sa katunayan inaasahan upang makakuha ng isang string mula sa user. Ngunit ngayon kailangan namin upang sabihin sa scanf isa iba pang mga bagay - kung saan upang ilagay ang string na Nagbibigay ang user. Well, ako ng pagpunta sa simulan medyo simple may comma s, na tumutukoy na gusto ko scanf upang ilagay ang string doon. Susunod na pupuntahan ko i-print ang isang bagay tulad ng printf "salamat para sa% s backslash n kuwit. "At tulad ng dati, ako pagpunta sa pumasa sa string, s. Ngayon i-save ipaalam, sumulat ng libro, at patakbuhin ito programa, at makita kung hindi namin maaaring magbuod ang problema hinulaang ko. Gumawa ng scanf-1. ./scanf-1. String mangyaring. Magbigay ng isang bagay tulad ng, Hayaan ang "kumusta." "Salamat para sa null." Hmm, hindi iyon kung ano ang inaasahan ko. Kaya kung ano ang nangyayari sa dito? Well, ito ay lumiliko out dahil ipinahayag namin s bilang isang pansamantalang trabaho bituin ngunit kami ay hindi talagang naka-imbak s sa address ng isang aktwal na tipak ng memory, scanf ginawang hindi mayroon kahit saan upang ilagay ang string na ang mga gumagamit na nai-type in Sa katunayan, kung ang gumagamit ay sa ngayon i-type ang isang mas matagal kaysa string "kumusta," halimbawa ng ilang mga linya ng teksto o ilang talata ng teksto, ito ay medyo posible na maaari naming magbuod isang tinatawag nang gayon segmentation fault. Dahil scanf ay hindi pagpunta sa malaman na Hindi ko pa talaga maglagay ng isang address sa loob ng s. Sa halip, ito ay pagpunta upang makita ang ilang halaga sa s, ang ilang mga pattern ng mga piraso na maaari napakahusay maging isang halaga ng basura, doon sa pamamagitan lamang ng pagkakataon. At scanf Pupunta pa rin upang subukang magsulat ang string ng user sa address na iyon, kahit na ito ay isang halaga na basura, na maaaring sa katunayan magbuod ng pag-crash. Kaya paano kami makapupunta sa ayusin ito?