SPIKA 1: Hebu kuandika mpango huo anapata kamba kutoka kwa mtumiaji bila kutumia CS50 Library kazi GetString. Kwa kufanya hivyo, tutaweza kwenda mbele na kutumia scanf, kazi ambayo GetString kazi kweli anatumia chini ya kofia. Lakini mimi nina kwenda kufanya hili kwa makusudi katika buggy njia. Mimi nina kwenda kufanya katika njia ambayo nadhani itakuwa haki, lakini zinageuka kuwa dhana yangu kwenda kabisa, kabisa kiujanja. Na kwa kweli, hatari kabisa. Kwa sababu mende kama moja mimi nina kuhusu kufanya inaweza kutumiwa na wapinzani kama kwamba mashine yako au mpango wako inaweza kuchukuliwa juu ya uwezekano. Hebu tuanze kama ifuatavyo. Kwanza hebu kutangaza kamba yetu, inayojulikana sasa kama nyota char, na kuiita s. Hebu ijayo haraka user kwa kamba, kama na "kamba tafadhali." Na hebu sasa kupata kamba kutoka kwa mtumiaji kutumia scanf, unquote quote, "% s." Katika maneno mengine, hebu kuwajulisha scanf kwamba sisi wala kwa kweli kutarajia kupata string kutoka kwa mtumiaji. Lakini sasa tunahitaji kuwaambia scanf nyingine jambo moja - mahali pa kuweka kamba kwamba user hutoa. Naam, mimi nina kwenda kabisa tu kuanza na comma s, inayobainisha kwamba Ningependa scanf kuweka kamba huko. Mimi nina ijayo kwenda magazeti nje kitu kama printf "shukrani kwa% s backslash n comma. "Na kama siku zote, mimi nina kwenda kupita katika kamba, s. Sasa hebu kuokoa, kukusanya, na kukimbia hii mpango, na kuona kama tunaweza si kutumika tatizo mimi alikadiria. Kufanya scanf-1. ./scanf-1. Kamba tafadhali. Hebu kutoa kitu kama, "hello." "Asante kwa null." Hmm, si kwamba nini nilikuwa kutarajia. Hivyo nini kinaendelea hapa? Naam, ni zamu nje kwa sababu sisi alitangaza s kama nyota char lakini hatukuwa kweli kuhifadhiwa s katika barua pepe ya chunk halisi ya kumbukumbu, scanf hakuwa mahali popote kuweka kamba kwamba mtumiaji typed in Hakika, kama user walikuwa sasa aina katika kamba muda mrefu zaidi kuliko "hello," kwa mfano mistari kadhaa ya maandishi au aya kadhaa ya maandishi, ni kabisa iwezekanavyo ili tupate kutumika kinachojulikana segmentation kosa. Kwa sababu scanf si kwenda kujua kwamba Mimi si kweli kuweka anwani ndani ya s. Badala yake, kwenda kuona baadhi ya thamani katika s, mfano baadhi ya bits ambayo inaweza vizuri sana kuwa na thamani ya takataka, pale tu kwa bahati. Na scanf bado ni kwenda kujaribu kuandika kamba user kwa anwani hiyo, hata kama ni takataka thamani, ambayo inaweza kweli kutumika ajali. Hivyo ni jinsi sisi ni kwenda kutatua tatizo hili?