>> SPEAKER 1: Ni skribi programon kiu gets ĉenon de la uzanto sen
uzante la CS50 Biblioteko funkcii GetString.
Por fari tion, ni iru antaŭen kaj uzi scanf, la funkcio kiun la GetString
funkcio fakte uzas sub la kapuĉo.
Sed mi tuj faru tion intence en kalesxo vojo.
Mi tuj faros en maniero, kiun mi opinias estus bone, sed tio rezultas ke
mia supozo tuj estu tute, tute misa.
Kaj fakte, sufiĉe danĝera.
Ĉar cimoj ŝatas la unu mi al fari povas esti ekspluatata de kontrauxuloj
tia, ke via maŝino aŭ via programo povas esti transprenita potenciale.
>> Ni komencu jene.
Unue ni deklaras nian kordo, alie konata nun kiel char stelo,
kaj voku gxin s.
Lets sekvanta instigas la uzanton por kordoj, kiel kun "kordo, bonvolu." Kaj
ni nun ek la kordoj de la uzanto uzante scanf, citaĵo unquote, "% s." En
Alivorte, ni informos scanf ke ni cxu fakte atendas ricevi kordo
de la uzanto.
>> Sed nun ni bezonas diri scanf unu alia afero -
kie meti la ŝnuron ke la uzanto provizas.
Nu, mi tuj tute simple starti kun komo s, specifante, ke mi ŝatus
scanf meti la kordo tie.
Mi sekvanta tuj presi ion kiel printf "dankon por la% s
backslash n komo. "Kaj kiel ĉiam, mi estas preterpasonta en la kordo, s.
Nun ni savu, kompili, kaj kuri ĉi programon, por kontroli ĉu ni ne povas indukti
la problemo mi antaŭdiris.
>> Faru scanf-1.
./scanf-1.
String bonvole.
Ni provizi iun kiel "saluton". "Dankon pro la nula." Hmm, tio ne
kion mi ekspektis.
Do kio okazas ĉi tie?
>> Nu, tio rezultas ĉar ni deklaras s kiel char stelo sed ni ne
reale stokitaj en s la adreso de reala eron de memoro, scanf ne
havi ie meti la kordo ke la uzanto tajpas in
Ja, se la uzanto devis nun tajpas en multe pli longa kordo ol "saluton!"
ekzemple plurajn liniojn de teksto aŭ plurajn alineojn de teksto, ĝi estas tute
ebla, ke ni povus indukti tn segmentación kulpo.
>> Ĉar scanf ne tuj scii, ke Mi fakte ne metis adreson
ene de s.
Pli ĝuste, ĝi tuj vidi ian valoron en s, iuj similajxon de bitoj kiuj povas
tre bone esti rubo valoro, tie nur hazardo.
Kaj scanf ankoraŭ provos skribi la uzanto kordo al tiu adreso,
eĉ se ĝi estas rubo valoro, kiun povus ja indukti kraŝo.
>> Do kiel ni ripari tion?