为什么VS2013告诉我使用scanf_s?

时间:2014-01-17 20:43:37

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

我在德克萨斯理工大学的编程课上,在上学期学习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;
}

1 个答案:

答案 0 :(得分:9)

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

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