1 00:00:00,000 --> 00:00:00,180 2 00:00:00,180 --> 00:00:02,920 >> SPEAKER 1: Írjunk egy programot, amely kap egy karakterláncot a felhasználó anélkül, hogy 3 00:00:02,920 --> 00:00:05,700 a CS50 Könyvtár funkció getString. 4 00:00:05,700 --> 00:00:08,720 Ehhez, akkor megy előre, és használja scanf, a funkció, hogy a getString 5 00:00:08,720 --> 00:00:10,950 funkció ténylegesen használja a motorháztető alatt. 6 00:00:10,950 --> 00:00:13,780 De én ezt tudatosan egy hibás módon. 7 00:00:13,780 --> 00:00:17,230 Fogok tenni oly módon, hogy azt hiszem, lenne helyes, de kiderül, hogy a 8 00:00:17,230 --> 00:00:19,380 Feltételezésem fog elég, elég hibás. 9 00:00:19,380 --> 00:00:20,800 És valóban, elég veszélyes. 10 00:00:20,800 --> 00:00:24,750 Mivel a hibák, mint az egyik én vagyok arról, hogy hogy kihasználva ellenfelek 11 00:00:24,750 --> 00:00:28,870 úgy, hogy a gép, vagy a programban átvehető lehetséges. 12 00:00:28,870 --> 00:00:30,200 >> Kezdjük az alábbiak szerint. 13 00:00:30,200 --> 00:00:33,540 Először nézzük kinyilvánítjuk húr, más néven most, mint egy char csillag, 14 00:00:33,540 --> 00:00:34,750 és hívja meg s. 15 00:00:34,750 --> 00:00:39,400 Lehetővé teszi, hogy a következő kéri a felhasználótól egy string, mint a "karakterlánc kérem." És 16 00:00:39,400 --> 00:00:44,250 nézzük most, hogy a húr a felhasználó a scanf, idézet idézet vége, "% s". -Ben 17 00:00:44,250 --> 00:00:47,760 Más szóval, most tájékoztatni scanf, hogy mi rendelkezései valóban számíthat arra, hogy a szöveg 18 00:00:47,760 --> 00:00:48,630 a felhasználó elől. 19 00:00:48,630 --> 00:00:50,810 >> De most meg kell mondani scanf egy másik dolog - 20 00:00:50,810 --> 00:00:53,350 hová tegye a húr, hogy a felhasználó megadja. 21 00:00:53,350 --> 00:00:57,840 Nos, én fogok egész egyszerűen elkezd vesszővel s, meghatározva, hogy szeretnék 22 00:00:57,840 --> 00:00:59,320 scanf, hogy a húr is. 23 00:00:59,320 --> 00:01:04,818 Én vagyok a következő lesz, hogy nyomtassa ki valamit mint a printf "köszönet a% s 24 00:01:04,818 --> 00:01:10,670 backslash n vessző. "És mint mindig, én vagyok majd át a húr, s. 25 00:01:10,670 --> 00:01:14,920 Most menteni, fordítsd, és futtassa ezt programot, hátha nem indukál 26 00:01:14,920 --> 00:01:16,590 A probléma, amit előre. 27 00:01:16,590 --> 00:01:18,650 >> Legyen scanf-1. 28 00:01:18,650 --> 00:01:20,960 ./scanf-1. 29 00:01:20,960 --> 00:01:21,830 Karakterlánc kérem. 30 00:01:21,830 --> 00:01:25,540 Nézzük hogy valami ilyesmit: "helló". "Köszönöm a null." Hmm, ez nem 31 00:01:25,540 --> 00:01:26,750 amit vártam. 32 00:01:26,750 --> 00:01:28,240 Szóval, mi folyik itt? 33 00:01:28,240 --> 00:01:32,040 >> Nos, kiderült, hogy azért, mert kijelentette, s mint a char csillag, de mi nem 34 00:01:32,040 --> 00:01:36,120 ténylegesen tárolt s címét egy tényleges darab memória, scanf nem 35 00:01:36,120 --> 00:01:38,940 sehol, hogy a húr hogy a felhasználó be beírt 36 00:01:38,940 --> 00:01:42,510 Valóban, ha a felhasználó volt, hogy már írja be sokkal hosszabb sor, mint a "Hello" 37 00:01:42,510 --> 00:01:46,780 például több sornyi szöveget vagy több bekezdésnyi szöveget, elég 38 00:01:46,780 --> 00:01:50,280 Lehetséges, hogy talán rábírja a úgynevezett szegmentációs hiba. 39 00:01:50,280 --> 00:01:53,570 >> Mivel a scanf nem fogja tudni, hogy Én valójában nem tesz címet 40 00:01:53,570 --> 00:01:54,610 belsejében s. 41 00:01:54,610 --> 00:01:58,000 Inkább ez fog látni bizonyos értéket A s néhány minta a bitek, amelyek 42 00:01:58,000 --> 00:02:00,910 nagyon jól lehet a szemetet értéket, ott csak véletlenül. 43 00:02:00,910 --> 00:02:04,600 És scanf még megpróbálom írni a felhasználó karakterlánc arra a címre, 44 00:02:04,600 --> 00:02:08,789 akkor is, ha ez egy szemét értéket, amely ami valóban indukál egy baleset. 45 00:02:08,789 --> 00:02:10,130 >> Szóval, hogyan fogjuk megoldani ezt? 46 00:02:10,130 --> 00:02:12,523