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 要做到这一点,我们将继续使用 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 首先,让我们声明我们的字符串, 现在也被称为一个char星, 14 00:00:33,540 --> 00:00:34,750 并调用它s。 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 我接下来将要打印出来的东西 如printf“感谢您的%s的 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 >> 嗯,原来是因为我们声明 S作为一个char明星,但我们没 34 00:01:32,040 --> 00:01:36,120 实际上存储在s的地址 的实际内存块,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 里面的秒。 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