1 00:00:00,000 --> 00:00:00,180 2 00:00:00,180 --> 00:00:02,920 >> SPEAKER 1: Ni skribi programon kiu gets ĉenon de la uzanto sen 3 00:00:02,920 --> 00:00:05,700 uzante la CS50 Biblioteko funkcii GetString. 4 00:00:05,700 --> 00:00:08,720 Por fari tion, ni iru antaŭen kaj uzi scanf, la funkcio kiun la GetString 5 00:00:08,720 --> 00:00:10,950 funkcio fakte uzas sub la kapuĉo. 6 00:00:10,950 --> 00:00:13,780 Sed mi tuj faru tion intence en kalesxo vojo. 7 00:00:13,780 --> 00:00:17,230 Mi tuj faros en maniero, kiun mi opinias estus bone, sed tio rezultas ke 8 00:00:17,230 --> 00:00:19,380 mia supozo tuj estu tute, tute misa. 9 00:00:19,380 --> 00:00:20,800 Kaj fakte, sufiĉe danĝera. 10 00:00:20,800 --> 00:00:24,750 Ĉar cimoj ŝatas la unu mi al fari povas esti ekspluatata de kontrauxuloj 11 00:00:24,750 --> 00:00:28,870 tia, ke via maŝino aŭ via programo povas esti transprenita potenciale. 12 00:00:28,870 --> 00:00:30,200 >> Ni komencu jene. 13 00:00:30,200 --> 00:00:33,540 Unue ni deklaras nian kordo, alie konata nun kiel char stelo, 14 00:00:33,540 --> 00:00:34,750 kaj voku gxin s. 15 00:00:34,750 --> 00:00:39,400 Lets sekvanta instigas la uzanton por kordoj, kiel kun "kordo, bonvolu." Kaj 16 00:00:39,400 --> 00:00:44,250 ni nun ek la kordoj de la uzanto uzante scanf, citaĵo unquote, "% s." En 17 00:00:44,250 --> 00:00:47,760 Alivorte, ni informos scanf ke ni cxu fakte atendas ricevi kordo 18 00:00:47,760 --> 00:00:48,630 de la uzanto. 19 00:00:48,630 --> 00:00:50,810 >> Sed nun ni bezonas diri scanf unu alia afero - 20 00:00:50,810 --> 00:00:53,350 kie meti la ŝnuron ke la uzanto provizas. 21 00:00:53,350 --> 00:00:57,840 Nu, mi tuj tute simple starti kun komo s, specifante, ke mi ŝatus 22 00:00:57,840 --> 00:00:59,320 scanf meti la kordo tie. 23 00:00:59,320 --> 00:01:04,818 Mi sekvanta tuj presi ion kiel printf "dankon por la% s 24 00:01:04,818 --> 00:01:10,670 backslash n komo. "Kaj kiel ĉiam, mi estas preterpasonta en la kordo, s. 25 00:01:10,670 --> 00:01:14,920 Nun ni savu, kompili, kaj kuri ĉi programon, por kontroli ĉu ni ne povas indukti 26 00:01:14,920 --> 00:01:16,590 la problemo mi antaŭdiris. 27 00:01:16,590 --> 00:01:18,650 >> Faru scanf-1. 28 00:01:18,650 --> 00:01:20,960 ./scanf-1. 29 00:01:20,960 --> 00:01:21,830 String bonvole. 30 00:01:21,830 --> 00:01:25,540 Ni provizi iun kiel "saluton". "Dankon pro la nula." Hmm, tio ne 31 00:01:25,540 --> 00:01:26,750 kion mi ekspektis. 32 00:01:26,750 --> 00:01:28,240 Do kio okazas ĉi tie? 33 00:01:28,240 --> 00:01:32,040 >> Nu, tio rezultas ĉar ni deklaras s kiel char stelo sed ni ne 34 00:01:32,040 --> 00:01:36,120 reale stokitaj en s la adreso de reala eron de memoro, scanf ne 35 00:01:36,120 --> 00:01:38,940 havi ie meti la kordo ke la uzanto tajpas in 36 00:01:38,940 --> 00:01:42,510 Ja, se la uzanto devis nun tajpas en multe pli longa kordo ol "saluton!" 37 00:01:42,510 --> 00:01:46,780 ekzemple plurajn liniojn de teksto aŭ plurajn alineojn de teksto, ĝi estas tute 38 00:01:46,780 --> 00:01:50,280 ebla, ke ni povus indukti tn segmentación kulpo. 39 00:01:50,280 --> 00:01:53,570 >> Ĉar scanf ne tuj scii, ke Mi fakte ne metis adreson 40 00:01:53,570 --> 00:01:54,610 ene de s. 41 00:01:54,610 --> 00:01:58,000 Pli ĝuste, ĝi tuj vidi ian valoron en s, iuj similajxon de bitoj kiuj povas 42 00:01:58,000 --> 00:02:00,910 tre bone esti rubo valoro, tie nur hazardo. 43 00:02:00,910 --> 00:02:04,600 Kaj scanf ankoraŭ provos skribi la uzanto kordo al tiu adreso, 44 00:02:04,600 --> 00:02:08,789 eĉ se ĝi estas rubo valoro, kiun povus ja indukti kraŝo. 45 00:02:08,789 --> 00:02:10,130 >> Do kiel ni ripari tion? 46 00:02:10,130 --> 00:02:12,523