当前位置:   article > 正文

VS2013提示error C4996: ‘scanf‘: This function or variable may be unsafe._错误1error c4996: 'scanf': this function or variable

错误1error c4996: 'scanf': this function or variable may be unsafe. consid

VS2013经常提示函数不安全(报错、报警告),怎么解决?

1. 引

经常有初学者提问,VS报错不能使用scanf函数,怎么办?

错误提示信息:
错误	1	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.	d:\2020_code\c_test\test_1_2\test_1_2\test.c	8	1	test_1_2
  • 1
截图效果:

在这里插入图片描述

2. 为什么呢?

其实VS报错的函数还有:

scanf
strcpy
strcat
sscanf
fopen
...
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

这些函数都是不安全的。

简单举个例子:

#include <stdio.h>
int main()
{
	char arr[5] = { 0 };//arr中只有5个元素的空间
	scanf("%s", arr);//这里输入的字符如果超过5个呢?怎么办?
	printf("%s\n", arr);
	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

这里如果在输入框中输入的字符超过5个会怎样呢?

scanf函数照样把输入的字符全部放入arr数组,arr数组越界,栈空间被破坏,程序奔溃

如下面:

在这里插入图片描述

这里scanf函数没有做空间越界的判断,所以被认为不安全。

其他几个函数也有类似的问题。

那怎么解决呢?

4. 解决方案
4.1 定义预定义符号:_CRT_SECURE_NO_WARNINGS

仔细阅读错误提示信息,我们不难发现,提示信息是这样的:

scanf函数不安全,考虑使用scanf_s来替换,如果不想看到错误,也可以使用_CRT_SECURE_NO_WARNINGS.

在这里插入图片描述

那怎么使用呢?

在你使用不安全函数的源文件(.c)文件中的第一行,一定是第一行加上一句话:

#define  _CRT_SECURE_NO_WARNINGS 1
  • 1

再去编译你的代码就好了。

注:

这里给大家解释一下,为什么不是使用scanf_s函数,因为scanf_s函数是VS编译器提供的,你如果在代码中使用了这个函数,你的代码如果放在gcc编译器下编译,就会不认识scanf_s函数,这样你的代码就不具有跨平台性,而且scanf_s的使用方式和scanf函数也有区别,我们一般不建议初学者使用。

那以后是不是每次在.c文件中都要在第一句代码处写:#define _CRT_SECURE_NO_WARNINGS 1呢?

4.1.1 一劳永逸的解决办法

可以让每一次新建的源文件中就包含这句代码。

方法:在VS的安装路劲下搜索:newc++file.cpp这个文件,在文件中加上:

#define  _CRT_SECURE_NO_WARNINGS 1
  • 1

以后创建的新的.c文件中都会自动有这句代码。

注:

在不同版本的VS环境下,newc++file.cpp这个文件的位置不同,也可能存在多个,所以建议自己多去尝试一下。

4.2 设置项目属性的预处理

打开工程的【解决方案资源管理器】->【属性】

在这里插入图片描述

在属性页中:

【配置属性】->【C/C+±>预处理器】->【预处理器定义 】中增加:

_CRT_SECURE_NO_WARNINGS,每个符号是用分号隔开的。

然后应用,确定,就好了。

在这里插入图片描述

这种方法,每一次项目都要设置,可能比较麻烦。

4.3 在创建项目的时候关闭安全提示

新建项目:

选择【Visual C++】->【Win32控制台应用程序】->【设置项目名称】->【设置项目位置】->【确定】

到下一页:

在这里插入图片描述

点击【下一步】,不是点击【完成】:

在这里插入图片描述

来到这个页面:

在这里插入图片描述

点击完成就行:

以后只会报警告,不会报错误,可以忽视这个警告。

到此为止,讲了3种实现方式,你喜欢哪一种呢?

留言告诉我哦~


全文完

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/390110
推荐阅读
相关标签
  

闽ICP备14008679号