SPEAKER 1: Pojďme napsat program, který dostane řetězec od uživatele bez pomocí CS50 Knihovna je fungovat GetString. Chcete-li to, budeme pokračovat a používat scanf, funkce, která GetString Funkce ve skutečnosti využívá pod kapotou. Ale budu to dělat záměrně v kočárku způsobem. Chystám se dělat tak, že si myslím, že by bylo v pořádku, ale ukazuje se, že můj předpoklad se děje na docela, docela špatná. A ve skutečnosti, docela nebezpečné. Protože chyby, jako ten, který jsem Chystám se aby mohou být využívány protivníky tak, aby váš počítač nebo váš program mohou být převzaty potenciálně. Začněme takto. Nejprve pojďme prohlašujeme, že náš řetězec, jinak nyní známý jako char hvězda, a volat to je. Umožňuje další vyzve uživatele k zadání řetězce, jako s "řetězec, prosím." A pojďme se dostat řetězec od uživatele pomocí scanf, citace konec citátu, "% s". V Jinými slovy, pojďme informovat scanf, že jsme se ve skutečnosti očekávat, že si řetězec od uživatele. Ale teď musíme říci, scanf ještě jedna věc - kam umístit řetězec, který uživatel poskytuje. No, budu se prostě začít s čárka s upřesněním, že bych chtěl scanf, aby řetězec zde. Já jsem vedle jít vytisknout něco jako printf "Díky za% s zpětné lomítko n čárka. "A jako vždy, jsem jít projít do řetězce, s.. Nyní se pojďme šetřit, zkompilovat a spustit tento programu, a uvidíme, jestli se to může vyvolat Problém jsem předpovídal. Ujistěte se scanf-1. ./scanf-1. String prosím. Pojďme poskytnout něco jako, "Dobrý den." "Díky za null." Hmm, to není to, co jsem očekával. Tak co se to tady děje? No, ukázalo se, protože jsme deklarovali s jako char hvězda, ale my ne ve skutečnosti uloženy v s adresou Skutečný kus paměti, scanf ne mít kam dát řetězec že uživatel zadali palců Ve skutečnosti, v případě, že uživatel měl nyní zadat mnohem delší řetězec než "ahoj," například několik řádků textu nebo několik odstavců textu, je to docela možné, že by mohl vyvolat tzv. poruchy segmentace. Vzhledem k tomu, scanf nebude vědět, že Jsem skutečně dát adresu uvnitř s. Spíše to bude vidět nějakou hodnotu v s, někteří vzor bitů, které mohou být velmi dobře být hodnota odpadky, tam jen náhodou. A scanf se stále bude snažit psát uživatel řetězec na tuto adresu, i v případě, že je hodnota odpadky, které by skutečně mohla vyvolat nehodu. Tak, jak budeme tento problém vyřešit?