【问题标题】:Why is VS2013 telling me to use scanf_s?为什么VS2013告诉我使用scanf_s?
【发布时间】:2014-01-17 20:43:36
【问题描述】:

我在德克萨斯理工大学的编程课上,在上学期忍受了 Python 之后,我终于上了 C++ 课。今天我们在课堂上制作 HelloWorld 程序时,我和其他一些人得到了 Microsoft Visual Studio 2013,告诉我们使用 scanf_s 而不是像讲师在他的程序中使用的 scanf。以下是我的代码。

#include <stdio.h>
int main(){

int i,j;
float x,y;
scanf("input a number: %d %d %f %f", &i, &j, &x, &y);

printf("print numbers a : %d \n",i);
printf("print numbers a : %10.3d \n", i);
printf("print numbers a : %-10.3d", i);

fflush(stdin);
getchar();
return 0;
}

【问题讨论】:

  • 我宁愿说......不要使用它,除非你对不可移植的代码没问题:afaik,这是微软的想法——我相信它只是一个“更安全”的 scanf 版本。 . 好意,但是...
  • scanf_s 是一个 Visual Studio 扩展,应该具有额外的安全增强功能。它可移植到 Visual Studio 之外。
  • 避免这个问题,你使用的是 C++,所以使用 std::cin 和 std::cout。繁荣。
  • fflush(stdin) 是未定义的行为。

标签: c++ visual-studio visual-c++ visual-studio-2013


【解决方案1】:

The _s family of functions 是 Microsoft 提供的标准库函数的“安全”变体。许多标准库函数被认为是不安全的,因为它们不允许或不需要用户防止缓冲区溢出。 _s 函数是允许/需要缓冲区溢出保护的替代方法(通常这意味着它们需要一个额外的参数来指定您传入的缓冲区的大小,但在 scanf_s() 的情况下,它需要包含格式字符串每个%c%C%s%S 参数的宽度说明符)。

您可以通过在项目设置中设置_CRT_NONSTDC_NO_WARNINGS 来禁用这些警告。或者,如果您选择,切换到 _s 函数(但请注意,这样做会将您的代码绑定到 Microsoft 运行时库 [或 C11;请参阅下面的 cmets],并使其不可移植)。

【讨论】:

  • 实际上,它们并不完全是微软独有的;它们是 C11 标准的可选部分。
  • @Angew 很有趣。 Microsoft 的实现是否 100% 兼容 C11 标准?他们存在的时间更长......
  • 我不知道,还没有真正检查过。我知道有一种情况是标准的参数交换顺序与 MS 函数相比(不记得是哪一个,MSDN 有一篇关于它的文章),但我相信总体思路是它们是相同的。
  • bsearch_sqsort_s 具有不同的参数顺序。我不知道任何其他差异,但我还没有完全审核来源。参数排序差异是历史上的意外:Visual C++ 实现是这些函数的第一个实现,在它们被标准化之前。在某些情况下,C 委员会标准化了一些不同于现有实践的东西(为什么,我不知道)。 Visual C++ 也没有实现这些安全函数应该使用的 C11 约束处理程序(相反,我们有一个类似的概念,称为 invalid parameter handler
猜你喜欢
  • 2012-10-25
  • 1970-01-01
  • 1970-01-01
  • 2012-04-29
  • 2019-09-14
  • 2016-04-25
  • 2014-10-25
  • 1970-01-01
  • 2014-09-12
相关资源
最近更新 更多