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ť?