>> 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?