【问题标题】:C Access violation writing location scanf_sC访问冲突写入位置scanf_s
【发布时间】:2014-04-22 18:21:09
【问题描述】:

这是我的代码:

main()
{
    char firstName[30], lastName[30];
    printf("What is your name? ");
    scanf_s("%s %s", firstName, lastName);
    printf("Your name is %s %s\n", firstName, lastName);
}

我尝试使用 scanf,但 VS 表示已弃用并推荐使用 scanf_s。我知道您在变量之前使用 &/pointer,除非它是 string/char[] (这是本意),我真的不知道错误是什么。也许是方法参数?任何帮助表示赞赏。

【问题讨论】:

  • 忽略他们反对半数标准库的运动。不过,如果需要,您可以在此处使用 scanf_s。重要的区别是任何char* 后面都跟有缓冲区的大小,包括终止符。
  • 不管怎样,如果你想学习C,微软工具是一个糟糕的选择。最好尝试 GCC 或任何其他非古代 C 编译器。
  • 谢谢。那么忽略弃用警告是否安全?而且我希望能够使用一个像样的 IDE(来自 IntelliJ for Java,Eclipse 对我来说似乎很可怕,VIM 怎么样?:D)。 Microsoft 工具是否包含 VS?
  • 如果你想编写可移植的代码,微软的弃用警告大多是假的。
  • @Mgetz:是的,他们成功地将其纳入可选附件,尽管他们没有显示出在未来几十年实施 99 标准的动力。这使得他们的弃用警告更加烦人。

标签: c string pointers printf scanf


【解决方案1】:

MS 习惯于用“安全”版本替换标准 C 函数,scanf_s 就是这样一种实现。文档在这里:http://msdn.microsoft.com/en-us/library/w40768et.aspx

我相信如果您进行此更改,错误将会消失:

scanf_s("%s %s", firstName, _countof(firstName), lastName, _countof(lastName));

我也相信有一种方法可以解决他们对语言的破坏,但正是因为这个原因,我几年前就停止使用 MSVC。

【讨论】:

  • 更好地链接到 C 标准,可选部分:C99 with Technical corrigenda TC1, TC2, and TC3 included
  • 或者使用if (scanf("%29s%29s", firstName, lastName) != 2) /* error */;,它永远适用于每个 C 实现。
  • 谢谢大家。您是说您停止使用 MSVC;你现在用什么?为什么这些“安全”方法会损坏?请原谅我的提问,我只是想知道:)
  • Deduplicator,我不认为 scanf_s 是任何 ISO 版本的 C 标准的一部分,因此我链接到 MS 文档。
  • 规范性附件中的 C11(可选扩展)。 K.3.5.3.4 scanf_s 函数。此定义与 MS 版本之间可能存在细微差别。
猜你喜欢
  • 1970-01-01
  • 2018-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多