1 00:00:00,000 --> 00:00:00,180 2 00:00:00,180 --> 00:00:02,920 >> SPEAKER 1: Pojďme napsat program, který dostane řetězec od uživatele bez 3 00:00:02,920 --> 00:00:05,700 pomocí CS50 Knihovna je fungovat GetString. 4 00:00:05,700 --> 00:00:08,720 Chcete-li to, budeme pokračovat a používat scanf, funkce, která GetString 5 00:00:08,720 --> 00:00:10,950 Funkce ve skutečnosti využívá pod kapotou. 6 00:00:10,950 --> 00:00:13,780 Ale budu to dělat záměrně v kočárku způsobem. 7 00:00:13,780 --> 00:00:17,230 Chystám se dělat tak, že si myslím, že by bylo v pořádku, ale ukazuje se, že 8 00:00:17,230 --> 00:00:19,380 můj předpoklad se děje na docela, docela špatná. 9 00:00:19,380 --> 00:00:20,800 A ve skutečnosti, docela nebezpečné. 10 00:00:20,800 --> 00:00:24,750 Protože chyby, jako ten, který jsem Chystám se aby mohou být využívány protivníky 11 00:00:24,750 --> 00:00:28,870 tak, aby váš počítač nebo váš program mohou být převzaty potenciálně. 12 00:00:28,870 --> 00:00:30,200 >> Začněme takto. 13 00:00:30,200 --> 00:00:33,540 Nejprve pojďme prohlašujeme, že náš řetězec, jinak nyní známý jako char hvězda, 14 00:00:33,540 --> 00:00:34,750 a volat to je. 15 00:00:34,750 --> 00:00:39,400 Umožňuje další vyzve uživatele k zadání řetězce, jako s "řetězec, prosím." A 16 00:00:39,400 --> 00:00:44,250 pojďme se dostat řetězec od uživatele pomocí scanf, citace konec citátu, "% s". V 17 00:00:44,250 --> 00:00:47,760 Jinými slovy, pojďme informovat scanf, že jsme se ve skutečnosti očekávat, že si řetězec 18 00:00:47,760 --> 00:00:48,630 od uživatele. 19 00:00:48,630 --> 00:00:50,810 >> Ale teď musíme říci, scanf ještě jedna věc - 20 00:00:50,810 --> 00:00:53,350 kam umístit řetězec, který uživatel poskytuje. 21 00:00:53,350 --> 00:00:57,840 No, budu se prostě začít s čárka s upřesněním, že bych chtěl 22 00:00:57,840 --> 00:00:59,320 scanf, aby řetězec zde. 23 00:00:59,320 --> 00:01:04,818 Já jsem vedle jít vytisknout něco jako printf "Díky za% s 24 00:01:04,818 --> 00:01:10,670 zpětné lomítko n čárka. "A jako vždy, jsem jít projít do řetězce, s.. 25 00:01:10,670 --> 00:01:14,920 Nyní se pojďme šetřit, zkompilovat a spustit tento programu, a uvidíme, jestli se to může vyvolat 26 00:01:14,920 --> 00:01:16,590 Problém jsem předpovídal. 27 00:01:16,590 --> 00:01:18,650 >> Ujistěte se scanf-1. 28 00:01:18,650 --> 00:01:20,960 ./scanf-1. 29 00:01:20,960 --> 00:01:21,830 String prosím. 30 00:01:21,830 --> 00:01:25,540 Pojďme poskytnout něco jako, "Dobrý den." "Díky za null." Hmm, to není 31 00:01:25,540 --> 00:01:26,750 to, co jsem očekával. 32 00:01:26,750 --> 00:01:28,240 Tak co se to tady děje? 33 00:01:28,240 --> 00:01:32,040 >> No, ukázalo se, protože jsme deklarovali s jako char hvězda, ale my ne 34 00:01:32,040 --> 00:01:36,120 ve skutečnosti uloženy v s adresou Skutečný kus paměti, scanf ne 35 00:01:36,120 --> 00:01:38,940 mít kam dát řetězec že uživatel zadali palců 36 00:01:38,940 --> 00:01:42,510 Ve skutečnosti, v případě, že uživatel měl nyní zadat mnohem delší řetězec než "ahoj," 37 00:01:42,510 --> 00:01:46,780 například několik řádků textu nebo několik odstavců textu, je to docela 38 00:01:46,780 --> 00:01:50,280 možné, že by mohl vyvolat tzv. poruchy segmentace. 39 00:01:50,280 --> 00:01:53,570 >> Vzhledem k tomu, scanf nebude vědět, že Jsem skutečně dát adresu 40 00:01:53,570 --> 00:01:54,610 uvnitř s. 41 00:01:54,610 --> 00:01:58,000 Spíše to bude vidět nějakou hodnotu v s, někteří vzor bitů, které mohou být 42 00:01:58,000 --> 00:02:00,910 velmi dobře být hodnota odpadky, tam jen náhodou. 43 00:02:00,910 --> 00:02:04,600 A scanf se stále bude snažit psát uživatel řetězec na tuto adresu, 44 00:02:04,600 --> 00:02:08,789 i v případě, že je hodnota odpadky, které by skutečně mohla vyvolat nehodu. 45 00:02:08,789 --> 00:02:10,130 >> Tak, jak budeme tento problém vyřešit? 46 00:02:10,130 --> 00:02:12,523