1 00:00:00,000 --> 00:00:00,180 2 00:00:00,180 --> 00:00:02,920 >> SPEAKER 1: Oletame, kirjutada programm, mis saab string kasutaja ilma 3 00:00:02,920 --> 00:00:05,700 kasutades CS50 Raamatukogu toimida getString. 4 00:00:05,700 --> 00:00:08,720 Et seda teha, siis me minna ja kasutada scanf funktsioon, et getString 5 00:00:08,720 --> 00:00:10,950 funktsioon tegelikult kasutab all kapuuts. 6 00:00:10,950 --> 00:00:13,780 Aga ma teen seda tahtlikult aastal lollakas viisil. 7 00:00:13,780 --> 00:00:17,230 Ma teen nii, et ma arvan, et oleks õige, kuid selgub, et 8 00:00:17,230 --> 00:00:19,380 minu oletus läheb üsna, üsna puudulik. 9 00:00:19,380 --> 00:00:20,800 Ja tõepoolest, üsna ohtlik. 10 00:00:20,800 --> 00:00:24,750 Sest vigu nagu ma olen umbes teha saab ära kasutada vastaste 11 00:00:24,750 --> 00:00:28,870 nii, et teie masin või oma programmi võib võtta kui potentsiaalset. 12 00:00:28,870 --> 00:00:30,200 >> Alustame järgnevalt. 13 00:00:30,200 --> 00:00:33,540 Esiteks olgem tunnistada meie string, muidu tuntud nüüd char star, 14 00:00:33,540 --> 00:00:34,750 ja nimetavad seda s. 15 00:00:34,750 --> 00:00:39,400 Lets järgmine kiire kasutaja jaoks string, Nagu "string palun." Ja 16 00:00:39,400 --> 00:00:44,250 olgem nüüd saan stringi kasutaja kasutades scanf, tsitaat lõppeb, "% s." Sisse 17 00:00:44,250 --> 00:00:47,760 Teisisõnu, olgem teatama scanf et me ei tegelikult oodata, et saada string 18 00:00:47,760 --> 00:00:48,630 kasutaja. 19 00:00:48,630 --> 00:00:50,810 >> Aga nüüd peame ütlema scanf üks asi - 20 00:00:50,810 --> 00:00:53,350 kuhu panna stringi kasutaja näeb. 21 00:00:53,350 --> 00:00:57,840 Noh, ma lähen lihtsalt alustada komadega s, täpsustades, et ma tahaks 22 00:00:57,840 --> 00:00:59,320 scanf panna string seal. 23 00:00:59,320 --> 00:01:04,818 Ma järgmine läheb välja trükkida midagi nagu printf "thanks for% s 24 00:01:04,818 --> 00:01:10,670 kurakriips n koma. "Ja nagu alati, ma olen läheb edasi stringi, s. 25 00:01:10,670 --> 00:01:14,920 Nüüd salvestada, kompileerida ja käivitada programmi, ja vaata, kui me ei saa esile kutsuda 26 00:01:14,920 --> 00:01:16,590 probleem ma ennustasin. 27 00:01:16,590 --> 00:01:18,650 >> Tee scanf-1. 28 00:01:18,650 --> 00:01:20,960 ./scanf-1. 29 00:01:20,960 --> 00:01:21,830 String palun. 30 00:01:21,830 --> 00:01:25,540 Anname midagi, "tere". "Aitäh null." Hmm, see ei ole 31 00:01:25,540 --> 00:01:26,750 mida ma ootasin. 32 00:01:26,750 --> 00:01:28,240 Mis siis siin toimub? 33 00:01:28,240 --> 00:01:32,040 >> Noh, tuli välja, sest me kuulutasime s kui char star kuid me ei 34 00:01:32,040 --> 00:01:36,120 tegelikult salvestatud s aadress tegelik tüki mälu, scanf ei 35 00:01:36,120 --> 00:01:38,940 on kuhugi panna string et kasutaja sisestatud sisse 36 00:01:38,940 --> 00:01:42,510 Tõepoolest, kui kasutaja oli nüüd kirjuta palju pikem string kui "tere" 37 00:01:42,510 --> 00:01:46,780 näiteks mitu rida teksti või mitu lõiku teksti, see on üsna 38 00:01:46,780 --> 00:01:50,280 Võimalik, et me võiksime kutsuda esile nn killustatust süü. 39 00:01:50,280 --> 00:01:53,570 >> Kuna scanf ei kavatse teame, et Ma ei ole tegelikult panna aadress 40 00:01:53,570 --> 00:01:54,610 sees s. 41 00:01:54,610 --> 00:01:58,000 Pigem see läheb, et näha mõned raha s, mõned muster bitti, mis võivad 42 00:01:58,000 --> 00:02:00,910 väga hästi olla prügi väärtus, seal lihtsalt juhus. 43 00:02:00,910 --> 00:02:04,600 Ja scanf ikka üritan kirjutada kasutaja string sellele aadressile, 44 00:02:04,600 --> 00:02:08,789 isegi kui see on prügi väärtus, mis võib tõepoolest esile kutsuda crash. 45 00:02:08,789 --> 00:02:10,130 >> Niisiis, kuidas me saame seda parandada? 46 00:02:10,130 --> 00:02:12,523