>> Gjuha 1: Le të shkruaj një program që merr një varg nga përdoruesit pa
duke përdorur CS50 Biblioteka e funksionojnë getString.
Për ta bërë këtë, ne do të shkojnë përpara dhe të përdorin scanf, funksioni që getString
funksion në fakt përdor nën kapuç.
Por unë jam duke shkuar për të bërë këtë qëllimisht në mënyrë gabime.
Unë jam duke shkuar për të bërë në një mënyrë që unë mendoj do të ishte e drejtë, por rezulton se
Supozimi im do të të jetë mjaft, mjaft të meta.
Dhe në fakt, mjaft të rrezikshme.
Për shkak të mete si ai unë jam gati për të të bëjë mund të shfrytëzohet nga kundërshtarët
tillë që kompjuterin tuaj ose programi juaj mund të merret përsipër potencialisht.
>> Le të fillojmë si më poshtë.
Së pari le të deklarojë vargun tonë, i njohur ndryshe tani si një yll char,
dhe e quajti atë s.
Lejon të ardhshëm të shpejtë të përdoruesit për një varg, si me "string ju lutem." Dhe
le të tani të merrni string nga përdoruesit duke përdorur scanf, quote mbyll thonjëzat, "% s." Në
Me fjalë të tjera, le të informojë scanf se ne e në fakt presin për të marrë një varg
nga përdoruesit.
>> Por tani ne kemi nevojë për të të treguar scanf një gjë tjetër -
ku për të vënë vargut që përdoruesi ofron.
E pra, unë jam duke shkuar për të filluar mjaft thjesht me presje s, duke specifikuar që unë do të doja
scanf për të vënë string atje.
Unë jam i ardhshëm do të shtypura nga diçka si printf "thanks for% s
backslash n presje. "Dhe si gjithmonë, unë jam i duke shkuar për të kaluar në string, s.
Tani le të shpëtojë, përpilojnë, dhe të drejtuar këtë program, dhe të shohim nëse ne nuk mund të sjell
problemi I parashikuar.
>> Bëni scanf-1.
./scanf-1.
String ju lutem.
Le të ofrojnë diçka si, "hello." "Faleminderit per null." Hmm, kjo nuk është e
ajo që unë prisja.
Pra, çfarë po ndodh këtu?
>> E pra, ajo rezulton, sepse ne deklaruar s si një yll char por ne nuk e bëri
në të vërtetë ruhet në s adresën e një copë aktuale e kujtesës, scanf nuk e bëri
kanë ku të vënë string se përdoruesi typed in
Në të vërtetë, në qoftë se përdoruesi do të tani shkruani një varg shumë më e gjatë se "hello,"
për shembull disa rreshta të tekstit ose disa paragrafët e tekstit, është mjaft
e mundur që ne të mund të shkaktoj një ashtuquajturi faji segmentimit.
>> Sepse scanf nuk do të dinë se Unë nuk kam në të vërtetë vënë një adresë
brenda s.
Përkundrazi, ajo do të shohim disa vlera në s, disa model prej bit që mund të
shumë mirë të jetë një vlerë e mbeturinave, ka vetëm rastësisht.
Dhe scanf është ende do të përpiqen për të shkruar string përdoruesit në atë adresë,
edhe në qoftë se ajo është një vlerë e mbeturinave, të cilat me të vërtetë mund të shkaktoj një aksident.
>> Pra, si do të shkojmë për të rregulluar këtë?