今天在使用 VS 2017 编译一段 C 代码的时候,出现 “error C4996: ‘scanf’: This function or variable may be unsafe.” 的报错。同样的一段代码在 Dev cpp 中成功编译运行。
报错
1 | for (i = 0; i < m; i++) |
报错出现在 scanf
处。
解决方案
方案一
将 scanf
改为 scanf_s
方案二
使用 #define _CRT_SECURE_NO_WARNINGS
宏定义
方案三
在 VS 中新建项目的时候去掉“安全开发生命周期(SDL)检查”即可将错误转变成警告
方案四
在头文件中加入 #pragma warning(disable:4996)
原因
因为 scanf
函数不检查边界,因此很容易出现内存泄漏的问题,如:1
2char 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