1 00:00:00,000 --> 00:00:00,180 2 00:00:00,180 --> 00:00:02,920 >> SPEAKER 1: Kirjoitetaan ohjelma, joka saa merkkijonon k瓣ytt瓣j瓣 ilman 3 00:00:02,920 --> 00:00:05,700 k瓣ytt瓣en CS50 kirjaston toimiakseen getString. 4 00:00:05,700 --> 00:00:08,720 Voit tehd瓣 t瓣m瓣n, me menemme eteenp瓣in ja k瓣ytt瓣瓣 scanf, toiminto, joka getString 5 00:00:08,720 --> 00:00:10,950 toiminto itse asiassa k瓣ytt瓣瓣 alla huppu. 6 00:00:10,950 --> 00:00:13,780 Mutta aion tehd瓣 t瓣m瓣n tarkoituksella in buginen tavalla. 7 00:00:13,780 --> 00:00:17,230 Aion tehd瓣 tavalla, joka mielest瓣ni olisi oikea, mutta k瓣y ilmi, ett瓣 8 00:00:17,230 --> 00:00:19,380 oletan tulee olla varsin, varsin puutteellinen. 9 00:00:19,380 --> 00:00:20,800 Ja itse asiassa aika vaarallista. 10 00:00:20,800 --> 00:00:24,750 Koska vikoja jollainen olen aikeissa Merkki voidaan hy繹dynt瓣瓣 vastustajien 11 00:00:24,750 --> 00:00:28,870 siten, ett瓣 koneesi tai ohjelmaan voidaan hyv瓣ksy瓣 mahdollisesti. 12 00:00:28,870 --> 00:00:30,200 >> Aloitetaan seuraavasti. 13 00:00:30,200 --> 00:00:33,540 Katsotaanpa ensin julistamme merkkijono, joka tunnetaan nyt char t瓣hti, 14 00:00:33,540 --> 00:00:34,750 ja kutsua sit瓣 s. 15 00:00:34,750 --> 00:00:39,400 Lets vieress瓣 pyyt瓣瓣 k瓣ytt瓣j瓣lt瓣 merkkijonon, kuten "merkkijono kiitos." Ja 16 00:00:39,400 --> 00:00:44,250 Katsotaanpa nyt saada merkkijonon k瓣ytt瓣j瓣 k瓣ytt瓣en scanf, lainaus lainaus, "% s." Sis瓣瓣n 17 00:00:44,250 --> 00:00:47,760 Toisin sanoen, nyt ilmoittaa scanf ett瓣 me eiv瓣t itse asiassa odottaa saavansa merkkijono 18 00:00:47,760 --> 00:00:48,630 k瓣ytt瓣j瓣lt瓣. 19 00:00:48,630 --> 00:00:50,810 >> Mutta nyt meid瓣n t瓣ytyy kertoa scanf yksi muu asia - 20 00:00:50,810 --> 00:00:53,350 mihin merkkijono, joka k瓣ytt瓣j瓣 antaa. 21 00:00:53,350 --> 00:00:57,840 No, aion yksinkertaisesti aloittaa pilkulla s, t瓣smennet瓣瓣n, ett瓣 haluaisin 22 00:00:57,840 --> 00:00:59,320 scanf laittaa merkkijonon siell瓣. 23 00:00:59,320 --> 00:01:04,818 Olen vieress瓣 menossa tulostaa jotain kuten printf "kiitos% s 24 00:01:04,818 --> 00:01:10,670 kenoviiva n pilkku. "Ja kuten aina, olen menossa ohi merkkijonon, s. 25 00:01:10,670 --> 00:01:14,920 Nyt tallentaa, k瓣瓣nt瓣瓣 ja ajaa t瓣m瓣n ohjelma, ja katso jos emme voi aiheuttaa 26 00:01:14,920 --> 00:01:16,590 ongelma minulla ennusti. 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 kiitos. 30 00:01:21,830 --> 00:01:25,540 Katsotaanpa tarjota jotain, "Hei." "Kiitos null." Hmm, se ei ole 31 00:01:25,540 --> 00:01:26,750 mit瓣 odotin. 32 00:01:26,750 --> 00:01:28,240 Joten mit瓣 t瓣瓣ll瓣 tapahtuu? 33 00:01:28,240 --> 00:01:32,040 >> No, se k瓣瓣ntyy pois, koska me julisti s char t瓣hden mutta emme 34 00:01:32,040 --> 00:01:36,120 tosiasiallisesti varastoitu s osoite todellinen kimpale muisti, scanf ei 35 00:01:36,120 --> 00:01:38,940 ole paikkaa laittaa merkkijonon ett瓣 k瓣ytt瓣j瓣n kirjoitetaan sis瓣瓣n 36 00:01:38,940 --> 00:01:42,510 Itse asiassa, jos k瓣ytt瓣j瓣 oli nyt kirjoittaa paljon pidempi merkkijono kuin "hei" 37 00:01:42,510 --> 00:01:46,780 esimerkiksi useita rivej瓣 teksti瓣 tai useita kappaleita teksti瓣, se on melko 38 00:01:46,780 --> 00:01:50,280 mahdollista, ett瓣 voisimme aiheuttaa ns segmentointi vika. 39 00:01:50,280 --> 00:01:53,570 >> Koska scanf ei tule tiet瓣瓣, ett瓣 En ole itse laittaa osoitteen 40 00:01:53,570 --> 00:01:54,610 sis瓣ll瓣 s. 41 00:01:54,610 --> 00:01:58,000 Pikemminkin se tulee n瓣hd瓣 jotain arvoa s, jotkut malli bittien voi 42 00:01:58,000 --> 00:02:00,910 hyvinkin olla roskat arvo, siell瓣 vain sattumalta. 43 00:02:00,910 --> 00:02:04,600 Ja scanf on viel瓣 menossa yritt瓣瓣 kirjoittaa K瓣ytt瓣j瓣 merkkijono kyseiseen osoitteeseen, 44 00:02:04,600 --> 00:02:08,789 vaikka se on roskaa arvo, joka voisi todellakin aiheuttaa kaatumisen. 45 00:02:08,789 --> 00:02:10,130 >> Joten miten aiomme korjata t瓣m瓣n? 46 00:02:10,130 --> 00:02:12,523