>> SPEAKER 1: Poďme napísať program, ktorý dostane reťazec od užívateľa bez
pomocou CS50 Knižnica je fungovať GetString.
Ak to chcete, budeme pokračovať a používať scanf, funkcia, ktorá GetString
Funkcia v skutočnosti využíva pod kapotou.
Ale budem to robiť zámerne v kočíku spôsobom.
Chystám sa robiť tak, že si myslím, že by bolo v poriadku, ale ukazuje sa, že
môj predpoklad sa deje na celkom, celkom zlá.
A v skutočnosti, celkom nebezpečné.
Pretože chyby, ako ten, ktorý som Chystám sa aby mohli byť využívané protivníkmi
tak, aby váš počítač alebo váš program môžu byť prevzaté potenciálne.
>> Začnime takto.
Najprv poďme prehlasujeme, že náš reťazec, inak teraz známy ako char hviezda,
a volať to je.
Umožňuje ďalšie vyzve užívateľa na zadanie reťazca, ako s "reťazec, prosím." A
poďme sa dostať reťazec od užívateľa pomocou scanf, citácie koniec citátu, "% s". V
Inými slovami, poďme informovať scanf, že sme sa v skutočnosti očakávať, že si reťazec
od užívateľa.
>> Ale teraz musíme povedať, scanf ešte jedna vec -
kam umiestniť reťazec, ktorý užívateľ poskytuje.
No, budem sa jednoducho začať s čiarka s upresnením, že by som chcel
scanf, aby reťazec tu.
Ja som vedľa ísť vytlačiť niečo ako printf "Vďaka za% s
spätné lomítko n čiarka. "A ako vždy, som ísť prejsť do reťazca, s.
Teraz sa poďme šetriť, skompilovať a spustiť tento programu, a uvidíme, či sa to môže vyvolať
Problém som predpovedal.
>> Uistite sa scanf-1.
./scanf-1.
String prosím.
Poďme poskytnúť niečo ako, "Dobrý deň." "Vďaka za null." Hmm, to nie je
to, čo som očakával.
Tak čo sa to tu deje?
>> No, ukázalo sa, pretože sme deklarovali s ako char hviezda, ale my nie
v skutočnosti uložené v s adresou Skutočný kus pamäti, scanf nie
mať kam dať reťazec že užívateľ zadali palcov
V skutočnosti, v prípade, že používateľ mal teraz zadať oveľa dlhší reťazec ako "ahoj,"
napríklad niekoľko riadkov textu alebo niekoľko odsekov textu, je to celkom
možné, že by mohol vyvolať tzv poruchy segmentácia.
>> Vzhľadom k tomu, scanf nebude vedieť, že Som skutočne dať adresu
vnútri s
Skôr to bude vidieť nejakú hodnotu v s, niektorí vzor bitov, ktoré môžu byť
veľmi dobre byť hodnota odpadky, tam len náhodou.
A scanf sa stále bude snažiť písať užívateľ reťazec na túto adresu,
aj v prípade, že je hodnota odpadky, ktoré by skutočne mohla spôsobiť nehodu.
>> Tak, ako budeme tento problém vyriešiť?