1 00:00:00,000 --> 00:00:00,180 2 00:00:00,180 --> 00:00:02,920 >> SPEAKER 1: Да се ​​напише програма, която получава низ от потребителя без по- 3 00:00:02,920 --> 00:00:05,700 използване на CS50 библиотеката функционира GetString. 4 00:00:05,700 --> 00:00:08,720 За да направите това, ние ще вървим напред и да използват scanf, функцията че GetString 5 00:00:08,720 --> 00:00:10,950 функция всъщност използва под предния капак. 6 00:00:10,950 --> 00:00:13,780 Но аз ще направя това умишлено в бъги начин. 7 00:00:13,780 --> 00:00:17,230 Отивам да се направи по начин, който мисля, че би било правилно, но се оказва, че 8 00:00:17,230 --> 00:00:19,380 предположението ми ще бъде доста, доста погрешна. 9 00:00:19,380 --> 00:00:20,800 И в действителност, много опасно. 10 00:00:20,800 --> 00:00:24,750 Защото бъгове като едно аз съм за да направи може да бъде използвана от противниците 11 00:00:24,750 --> 00:00:28,870 такава, че вашата машина или вашата програма могат да бъдат взети над потенциално. 12 00:00:28,870 --> 00:00:30,200 >> Нека започнем, както следва. 13 00:00:30,200 --> 00:00:33,540 Първо, нека да заявяваме нашата поредица, по друг начин, известен сега като знак звезда, 14 00:00:33,540 --> 00:00:34,750 и да го наречем е. 15 00:00:34,750 --> 00:00:39,400 Позволява следващата напомни на потребителя за низ, Както и при "низ моля." И 16 00:00:39,400 --> 00:00:44,250 нека сега се низ от потребителя използване на scanf, в кавички, "% S". В 17 00:00:44,250 --> 00:00:47,760 С други думи, нека да информира scanf, че ние ми всъщност очаквате да получите низ 18 00:00:47,760 --> 00:00:48,630 от потребителя. 19 00:00:48,630 --> 00:00:50,810 >> Но сега трябва да кажа scanf едно друго нещо - 20 00:00:50,810 --> 00:00:53,350 къде да се постави низ че потребителят осигурява. 21 00:00:53,350 --> 00:00:57,840 Е, аз отивам да се доста просто да започнете със запетая ите, като се посочва, че бих искал 22 00:00:57,840 --> 00:00:59,320 scanf да постави низ там. 23 00:00:59,320 --> 00:01:04,818 Аз следващия ще разпечатате нещо като ФОРМАТ "благодаря за% S 24 00:01:04,818 --> 00:01:10,670 наклонена черта н запетая. "И както винаги, аз съм ще премине в низ, S. 25 00:01:10,670 --> 00:01:14,920 Сега нека да спаси, компилирате и стартирате тази програма, и да видим дали не можем да индуцира 26 00:01:14,920 --> 00:01:16,590 проблемът, прогнозира. 27 00:01:16,590 --> 00:01:18,650 >> Направете scanf-1. 28 00:01:18,650 --> 00:01:20,960 ./scanf-1. 29 00:01:20,960 --> 00:01:21,830 String моля. 30 00:01:21,830 --> 00:01:25,540 Да се ​​предложи нещо подобно, "здравей". "Благодаря за нула." Хм, това не е 31 00:01:25,540 --> 00:01:26,750 това, което аз очаквах. 32 00:01:26,750 --> 00:01:28,240 И така, какво става тук? 33 00:01:28,240 --> 00:01:32,040 >> Е, оказва се, защото ние декларирахме и като знак звезда, но не го направихме 34 00:01:32,040 --> 00:01:36,120 всъщност съхранява в и адреса на един действителното парче памет, scanf не направих 35 00:01:36,120 --> 00:01:38,940 Трябва навсякъде да се сложи низа че потребителят въвели инча 36 00:01:38,940 --> 00:01:42,510 В действителност, ако потребителят се налага да въвеждате в предприятието много по-дълъг низ от "здравей" 37 00:01:42,510 --> 00:01:46,780 например няколко реда текст, или няколко параграфа от текст, това е доста 38 00:01:46,780 --> 00:01:50,280 възможно, че ние може да предизвика т.нар сегментиране вина. 39 00:01:50,280 --> 00:01:53,570 >> Защото scanf няма да знаят, че Аз не съм всъщност сложи адрес 40 00:01:53,570 --> 00:01:54,610 във вътрешността на S. 41 00:01:54,610 --> 00:01:58,000 Вместо това, тя се случва да видя някаква стойност в S, някои модел на битовете, които могат 42 00:01:58,000 --> 00:02:00,910 много добре да бъде стойност за боклук, там просто по случайност. 43 00:02:00,910 --> 00:02:04,600 И scanf все още продължава да се опитам да напиша потребителския низ на този адрес, 44 00:02:04,600 --> 00:02:08,789 дори ако това е стойност за боклук, които наистина може да предизвика катастрофа. 45 00:02:08,789 --> 00:02:10,130 >> Така че как ще се определи това? 46 00:02:10,130 --> 00:02:12,523