vs2017使用函数Scanf报错解决方法!

在VS2017使用Scanf函数时,出现如下错误: 

 error C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

意思是,scanf 这个函数或者变量可能不安全。建议考虑使用函数scanf_s。为了不显示弃用说明(应该指的这个错误提示),可以使用_CRT_SECURE_NO_WARNINGS。详情见在线帮助。

其原因是函数scanf是ANSI C中的函数,其在读取时不检查边界,所以可能造成内存访问越界。例如分配了5个字节的空间,但读入了10个字节:

如果输入1234567890,则567890会被写到别的空间上去,从而导致程序运行异常。

有时黑客可以利用函数scanf 的这个不安全性黑掉系统。为了防止这一问题,从VC++2005开始,微软公司的VS提供了函数scanf_s。其功能与原版函数scanf 相同,不同的是,在调用函数scanf_s时,必须提供一个数字以表明最多读入多少位字符。上面第二行代码使用Scanf_s函数时,应如下书写:

表示最多读取4个字符,因为buf[4]要放'\0'。函数scanf_s的最后一个参数n是缓冲区的大小,表示最多读取n-1个字符。采用函数scanf_s读取单个字符时,也需要限定长度,如下书写:

函数Scanf_s是微软公司VS特有的函数。与Scanf功能相同,只是前者更安全可靠。

其解决方法如下:

1.若只用vs编写代码,还是使用Scanf_s函数比较好,比较安全可靠。

2.若编写的代码需要移植到其他IDE上,函数Scanf_s是VS特有,其他IDE不认识会报错,在vs仍希望使用Scanf,可以如下:(ps:方法只需要选择一个使用即可,感觉哪个方便就用那个!)

一.在VS上编程时,第一行首先写上  #define _CRT_SECURE_NO_WARNINGS

二.在VS上编程时,第一行首先写上  #pragma warning(disable:4996)

三.找到菜单栏的项目→项目的属性→C/C++→预处理器,右侧有个预处理器定义,在其参数中加上括号中的代码   (  ;  _CRT_SECURE_NO_WARNINGS)  如下图:

vs2017使用函数Scanf报错解决方法!_第1张图片

四.无需在程序最前面加那行代码,只需在新建项目时取消勾选“SDL检查”即可;若项目已建立好,在项目属性里关闭SDL检测(菜单栏的项目→项目的属性→C/C++→代码生成,在代码生成中有个安全检查,将启用安全检查修改为禁用安全检查。)如下图:

vs2017使用函数Scanf报错解决方法!_第2张图片

五.在项目属性----C/C++ ----命令行中添加:/D _CRT_SECURE_NO_WARNINGS就行了。如下图:

vs2017使用函数Scanf报错解决方法!_第3张图片

 问题就完美解决了!

你可能感兴趣的:(C语言)