1 00:00:00,000 --> 00:00:00,180 2 00:00:00,180 --> 00:00:02,920 >> SPEAKER 1: Poďme napísať program, ktorý dostane reťazec od užívateľa bez 3 00:00:02,920 --> 00:00:05,700 pomocou CS50 Knižnica je fungovať GetString. 4 00:00:05,700 --> 00:00:08,720 Ak to chcete, budeme pokračovať a používať scanf, funkcia, ktorá GetString 5 00:00:08,720 --> 00:00:10,950 Funkcia v skutočnosti využíva pod kapotou. 6 00:00:10,950 --> 00:00:13,780 Ale budem to robiť zámerne v kočíku spôsobom. 7 00:00:13,780 --> 00:00:17,230 Chystám sa robiť tak, že si myslím, že by bolo v poriadku, ale ukazuje sa, že 8 00:00:17,230 --> 00:00:19,380 môj predpoklad sa deje na celkom, celkom zlá. 9 00:00:19,380 --> 00:00:20,800 A v skutočnosti, celkom nebezpečné. 10 00:00:20,800 --> 00:00:24,750 Pretože chyby, ako ten, ktorý som Chystám sa aby mohli byť využívané protivníkmi 11 00:00:24,750 --> 00:00:28,870 tak, aby váš počítač alebo váš program môžu byť prevzaté potenciálne. 12 00:00:28,870 --> 00:00:30,200 >> Začnime takto. 13 00:00:30,200 --> 00:00:33,540 Najprv poďme prehlasujeme, že náš reťazec, inak teraz známy ako char hviezda, 14 00:00:33,540 --> 00:00:34,750 a volať to je. 15 00:00:34,750 --> 00:00:39,400 Umožňuje ďalšie vyzve užívateľa na zadanie reťazca, ako s "reťazec, prosím." A 16 00:00:39,400 --> 00:00:44,250 poďme sa dostať reťazec od užívateľa pomocou scanf, citácie koniec citátu, "% s". V 17 00:00:44,250 --> 00:00:47,760 Inými slovami, poďme informovať scanf, že sme sa v skutočnosti očakávať, že si reťazec 18 00:00:47,760 --> 00:00:48,630 od užívateľa. 19 00:00:48,630 --> 00:00:50,810 >> Ale teraz musíme povedať, scanf ešte jedna vec - 20 00:00:50,810 --> 00:00:53,350 kam umiestniť reťazec, ktorý užívateľ poskytuje. 21 00:00:53,350 --> 00:00:57,840 No, budem sa jednoducho začať s čiarka s upresnením, že by som chcel 22 00:00:57,840 --> 00:00:59,320 scanf, aby reťazec tu. 23 00:00:59,320 --> 00:01:04,818 Ja som vedľa ísť vytlačiť niečo ako printf "Vďaka za% s 24 00:01:04,818 --> 00:01:10,670 spätné lomítko n čiarka. "A ako vždy, som ísť prejsť do reťazca, s. 25 00:01:10,670 --> 00:01:14,920 Teraz sa poďme šetriť, skompilovať a spustiť tento programu, a uvidíme, či sa to môže vyvolať 26 00:01:14,920 --> 00:01:16,590 Problém som predpovedal. 27 00:01:16,590 --> 00:01:18,650 >> Uistite sa 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 Poďme poskytnúť niečo ako, "Dobrý deň." "Vďaka za null." Hmm, to nie je 31 00:01:25,540 --> 00:01:26,750 to, čo som očakával. 32 00:01:26,750 --> 00:01:28,240 Tak čo sa to tu deje? 33 00:01:28,240 --> 00:01:32,040 >> No, ukázalo sa, pretože sme deklarovali s ako char hviezda, ale my nie 34 00:01:32,040 --> 00:01:36,120 v skutočnosti uložené v s adresou Skutočný kus pamäti, scanf nie 35 00:01:36,120 --> 00:01:38,940 mať kam dať reťazec že užívateľ zadali palcov 36 00:01:38,940 --> 00:01:42,510 V skutočnosti, v prípade, že používateľ mal teraz zadať oveľa dlhší reťazec ako "ahoj," 37 00:01:42,510 --> 00:01:46,780 napríklad niekoľko riadkov textu alebo niekoľko odsekov textu, je to celkom 38 00:01:46,780 --> 00:01:50,280 možné, že by mohol vyvolať tzv poruchy segmentácia. 39 00:01:50,280 --> 00:01:53,570 >> Vzhľadom k tomu, scanf nebude vedieť, že Som skutočne dať adresu 40 00:01:53,570 --> 00:01:54,610 vnútri s 41 00:01:54,610 --> 00:01:58,000 Skôr to bude vidieť nejakú hodnotu v s, niektorí vzor bitov, ktoré môžu byť 42 00:01:58,000 --> 00:02:00,910 veľmi dobre byť hodnota odpadky, tam len náhodou. 43 00:02:00,910 --> 00:02:04,600 A scanf sa stále bude snažiť písať užívateľ reťazec na túto adresu, 44 00:02:04,600 --> 00:02:08,789 aj v prípade, že je hodnota odpadky, ktoré by skutočne mohla spôsobiť nehodu. 45 00:02:08,789 --> 00:02:10,130 >> Tak, ako budeme tento problém vyriešiť? 46 00:02:10,130 --> 00:02:12,523