1 00:00:00,000 --> 00:00:00,180 2 00:00:00,180 --> 00:00:02,920 >> Выступающий 1: Давайте напишем программу, которая получает строку от пользователя без 3 00:00:02,920 --> 00:00:05,700 используя CS50 библиотеки функционировать GetString. 4 00:00:05,700 --> 00:00:08,720 Чтобы сделать это, мы будем идти вперед и использовать зсапЕ, функция, что 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 давайте теперь получить строку от пользователя используя зсапЕ, цитирую конец цитаты, "% ы". В 17 00:00:44,250 --> 00:00:47,760 Другими словами, давайте информировать зсапЕ этого мы у на самом деле ожидать, чтобы получить строку 18 00:00:47,760 --> 00:00:48,630 от пользователя. 19 00:00:48,630 --> 00:00:50,810 >> Но теперь мы должны сказать зсапЕ еще одна вещь - 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 зсапЕ поместите строку там. 23 00:00:59,320 --> 00:01:04,818 Я рядом собираюсь распечатать что-то как Е "спасибо за% с 24 00:01:04,818 --> 00:01:10,670 косая черта п запятая. "И, как всегда, я собирается пройти в строке, с. 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 Строка пожалуйста. 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 на самом деле хранится в ы адрес фактическая часть памяти, зсапЕ не сделал 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 >> Потому зсапЕ не будет знать, что Я фактически не положить адрес 40 00:01:53,570 --> 00:01:54,610 внутри с. 41 00:01:54,610 --> 00:01:58,000 Скорее, это будет увидеть некоторое значение в с, некоторые картины из битов, которые могут 42 00:01:58,000 --> 00:02:00,910 очень хорошо иметь значение мусора, там просто случайно. 43 00:02:00,910 --> 00:02:04,600 И зсапЕ по-прежнему будет пытаться писать пользователь строка по этому адресу, 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