>> SIARADWR 1: Dewch i ysgrifennu rhaglen sy'n cael llinyn gan y defnyddiwr heb
ddefnyddio'r Llyfrgell CS50 yn weithredu'n GetString.
I wneud hyn, byddwn yn mynd yn ei flaen ac yn defnyddio scanf, y swyddogaeth y mae'r GetString
swyddogaeth yn defnyddio mewn gwirionedd o dan y cwfl.
Ond dw i'n mynd i wneud hyn yn fwriadol mewn ffordd bygi.
Dw i'n mynd i wneud mewn ffordd yr wyf yn meddwl Byddai fod yn iawn, ond mae'n troi allan bod
fy rhagdybiaeth yn mynd i fod yn eithaf, yn eithaf ddiffygiol.
Ac yn wir, yn eithaf peryglus.
Oherwydd bod bugs fel yr un rwy'n ar fin sicrhau y gall gael eu hecsbloetio gan gwrthwynebwyr
fel bod eich peiriant neu eich rhaglen gellir eu cymryd drosodd o bosibl.
>> Gadewch i ni ddechrau fel a ganlyn.
Yn gyntaf gadewch i ni ddatgan ein llinyn, a elwir fel arall bellach yn seren torgoch,
a galw mae'n s.
Dewch i nesaf annog y defnyddiwr ar gyfer llinyn, fel gyda "llinyn gwelwch yn dda." A
gadewch i ni yn awr yn cael y llinyn gan y defnyddiwr ddefnyddio scanf, dyfynnwch unquote, "% s." Yn
geiriau eraill, gadewch i ni roi gwybod scanf ein bod yn mewn gwirionedd yn disgwyl i gael llinyn
gan y defnyddiwr.
>> Ond yn awr mae angen i ni ddweud wrth scanf un peth arall -
ble i roi'r llinyn y y defnyddiwr yn eu darparu.
Wel, dw i'n mynd i yn syml iawn yn dechrau gyda choma s, gan nodi y byddwn i'n hoffi
scanf i roi'r llinyn yno.
Rydw i'n nesaf yn mynd i argraffu rhywbeth fel printf "diolch am y% s
slaes n coma. "Ac fel bob amser, rwy'n mynd i basio yn y llinyn, s.
Nawr, gadewch i ni arbed, crynhoi, ac yn rhedeg y rhaglen, a gweld os na allwn achosi
y broblem roeddwn yn rhagweld.
>> Gwneud scanf-1.
./scanf-1.
Llinynnol gwelwch yn dda.
Gadewch i ni roi rhywbeth fel, "helo." "Diolch am y null." Hmm, nid yw hynny'n
yr hyn yr wyf yn ei ddisgwyl.
Felly, beth sy'n digwydd yma?
>> Wel, mae'n troi allan oherwydd ein bod yn datgan s fel seren torgoch, ond ni wnaethom
storio mewn gwirionedd yn y cyfeiriad o darn gwirioneddol y cof, nid oedd scanf
rhaid i unrhyw le i roi'r llinyn bod y defnyddiwr deipio i mewn
Yn wir, os bydd y defnyddiwr yn teipio yn awr llinyn llawer hirach na "helo,"
er enghraifft nifer o linellau o destun neu sawl paragraff o destun, mae'n eithaf
bosibl y gallem gymell hyn a elwir yn wall.
>> Gan nad scanf yn mynd i wybod bod Nid wyf mewn gwirionedd wedi rhoi cyfeiriad
tu mewn s.
Yn hytrach, mae'n mynd i weld rhywfaint o werth mewn s, mae rhai batrwm o ddarnau a all
yn dda iawn fod yn werth garbage, yno yn unig ar hap.
Ac scanf yn dal yn mynd i geisio ysgrifennu y llinyn defnyddiwr i'r cyfeiriad hwnnw,
hyd yn oed os yw'n werth garbage, a oedd yn Gallai yn wir achosi damwain.
>> Felly, sut yr ydym yn mynd i atgyweiria hon?