扬声器1:让我们写一个程序, 从用户得到的字符串不 使用CS50图书馆 函数GetString的。 要做到这一点,我们将继续使用 scanf函数,该函数的GetString的 函数实际上使用 引擎盖下方。 但我要故意这样做 在越野车的方式。 我会做的方式,我认为 会是正确的,但事实证明, 我的假设是要 是相当,相当的缺陷。 而事实上,相当危险。 因为像我快要错误 使得可以通过对手所利用 这样,您的机器或程序 可以接管可能。 让我们开始如下。 首先,让我们声明我们的字符串, 现在也被称为一个char星, 并调用它s。 让接下来的提示输入字符串的用户, 与“字符串,请。”和 现在让我们得到字符串从用户 使用scanf函数,报价引文结束,“%s的。”在 换句话说,让我们来告诉scanf函数,我们 确实是希望得到一个字符串 从用户。 但现在我们需要告诉scanf函数 另一件事 - 放在哪里的字符串 用户所提供的。 嗯,我会很简单地启动 用逗号秒,指定我想 scanf函数把字符串那里。 我接下来将要打印出来的东西 如printf“感谢您的%s的 反斜杠Ñ逗号。“与往常一样,我 要通过在字符串,秒。 现在让我们保存,编译并运行此 程序,看看如果我们不能诱发 这个问题我预言。 使scanf函数-1。 ./scanf-1。 字符串请。 让我们提供的东西一样,“你好。” “谢谢你的空。”嗯,这不是 我所期待的。 那么,什么是怎么回事? 嗯,原来是因为我们声明 S作为一个char明星,但我们没 实际上存储在s的地址 的实际内存块,scanf函数没有 必须随时随地把字符串 用户键入。 事实上,如果用户要键入现在在 一个更长的字符串不是“你好”, 比如几行文字或 文本的几个段落,这是相当 可能我们会诱发 所谓分段错误。 因为scanf函数是不会知道 我还没有真正把一个地址 里面的秒。 相反,它会看到一些价值 s中,一些模式位可能 很好是一个垃圾值, 那里只是偶然。 和scanf还是要去尝试写 用户字符串到该地址, 即使它是一个垃圾值,这 确实可以导致系统崩溃。 那么我们如何解决这一问题?