>> SPEAKER 1: Írjunk egy programot, amely kap egy karakterláncot a felhasználó anélkül, hogy
a CS50 Könyvtár funkció getString.
Ehhez, akkor megy előre, és használja scanf, a funkció, hogy a getString
funkció ténylegesen használja a motorháztető alatt.
De én ezt tudatosan egy hibás módon.
Fogok tenni oly módon, hogy azt hiszem, lenne helyes, de kiderül, hogy a
Feltételezésem fog elég, elég hibás.
És valóban, elég veszélyes.
Mivel a hibák, mint az egyik én vagyok arról, hogy hogy kihasználva ellenfelek
úgy, hogy a gép, vagy a programban átvehető lehetséges.
>> Kezdjük az alábbiak szerint.
Először nézzük kinyilvánítjuk húr, más néven most, mint egy char csillag,
és hívja meg s.
Lehetővé teszi, hogy a következő kéri a felhasználótól egy string, mint a "karakterlánc kérem." És
nézzük most, hogy a húr a felhasználó a scanf, idézet idézet vége, "% s". -Ben
Más szóval, most tájékoztatni scanf, hogy mi rendelkezései valóban számíthat arra, hogy a szöveg
a felhasználó elől.
>> De most meg kell mondani scanf egy másik dolog -
hová tegye a húr, hogy a felhasználó megadja.
Nos, én fogok egész egyszerűen elkezd vesszővel s, meghatározva, hogy szeretnék
scanf, hogy a húr is.
Én vagyok a következő lesz, hogy nyomtassa ki valamit mint a printf "köszönet a% s
backslash n vessző. "És mint mindig, én vagyok majd át a húr, s.
Most menteni, fordítsd, és futtassa ezt programot, hátha nem indukál
A probléma, amit előre.
>> Legyen scanf-1.
./scanf-1.
Karakterlánc kérem.
Nézzük hogy valami ilyesmit: "helló". "Köszönöm a null." Hmm, ez nem
amit vártam.
Szóval, mi folyik itt?
>> Nos, kiderült, hogy azért, mert kijelentette, s mint a char csillag, de mi nem
ténylegesen tárolt s címét egy tényleges darab memória, scanf nem
sehol, hogy a húr hogy a felhasználó be beírt
Valóban, ha a felhasználó volt, hogy már írja be sokkal hosszabb sor, mint a "Hello"
például több sornyi szöveget vagy több bekezdésnyi szöveget, elég
Lehetséges, hogy talán rábírja a úgynevezett szegmentációs hiba.
>> Mivel a scanf nem fogja tudni, hogy Én valójában nem tesz címet
belsejében s.
Inkább ez fog látni bizonyos értéket A s néhány minta a bitek, amelyek
nagyon jól lehet a szemetet értéket, ott csak véletlenül.
És scanf még megpróbálom írni a felhasználó karakterlánc arra a címre,
akkor is, ha ez egy szemét értéket, amely ami valóban indukál egy baleset.
>> Szóval, hogyan fogjuk megoldani ezt?