VS2017中'scanf': This function or variable may be unsafe.报错

  今天在使用 VS 2017 编译一段 C 代码的时候,出现 “error C4996: ‘scanf’: This function or variable may be unsafe.” 的报错。同样的一段代码在 Dev cpp 中成功编译运行。

报错

1
2
3
for (i = 0; i < m; i++)
for (j = 0; j < n; j++)
scanf("%d", &a[i][j]);

报错出现在 scanf 处。

解决方案

方案一

  将 scanf 改为 scanf_s

方案二

  使用 #define _CRT_SECURE_NO_WARNINGS 宏定义

方案三

  在 VS 中新建项目的时候去掉“安全开发生命周期(SDL)检查”即可将错误转变成警告

方案四

  在头文件中加入 #pragma warning(disable:4996)

原因

  因为 scanf 函数不检查边界,因此很容易出现内存泄漏的问题,如:

1
2
char s[3];
scanf("%s", &s);

如果我输入一段超过3个字节的字符串,由于s只有3个字节的长度,剩下的文字就写入了s后面的其他空间,出现缓冲区溢出。而_s后缀的函数,会有额外的参数,用来说明缓冲区的长度.比如:

1
scanf_s("%s", &s, 3);

因此,微软在新版的 VS 中强制使用安全的 scanf_s

参考资料

关于 scanf_s 的更多细节: http://code.wikia.com/wiki/Scanf_s