为什么VS2013告诉我使用scanf_s?

tec*_*k23 3 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;
}
Run Code Online (Sandbox Code Playgroud)

Typ*_*eIA 9

_s系列函数是由微软提供的标准库函数"安全"的变种.许多标准库函数不被认为是安全的,因为它们不允许或不要求用户防止缓冲区溢出.该_s功能的替代品,允许/需要的缓冲区溢出保护(通常这意味着他们需要一个额外的参数指定要传递的缓冲区的大小,但在的情况下,scanf_s()它要求的格式字符串包含每个宽度说明%c,%C,%s%S参数).

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

  • 实际上,它们并不完全是微软的; 它们是C11标准的可选部分. (2认同)
  • `bsearch_s`和`qsort_s`具有不同的参数排序.我不知道有任何其他差异,但我没有完全审核来源.参数排序差异是历史事故:Visual C++实现是这些函数在标准化之前的第一个实现.在某些情况下,C委员会标准化了除现有实践之外的其他东西(为什么,我不知道).Visual C++也没有实现这些安全函数应该使用的C11约束处理程序(相反,我们有一个类似的概念,称为_invalid参数handler_) (2认同)