VS2013提示error C4996: ‘scanf‘: This function or variable may be unsafe.

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
截图效果:

在这里插入图片描述

2. 为什么呢?

其实VS报错的函数还有:

scanf
strcpy
strcat
sscanf
fopen
...

这些函数都是不安全的。

简单举个例子:

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

这里如果在输入框中输入的字符超过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

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

注:

这里给大家解释一下,为什么不是使用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

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

注:

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

4.2 设置项目属性的预处理

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

在这里插入图片描述

在属性页中:

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

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

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

在这里插入图片描述

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

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

新建项目:

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

到下一页:

在这里插入图片描述

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

在这里插入图片描述

来到这个页面:

在这里插入图片描述

点击完成就行:

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

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

留言告诉我哦~


全文完

  • 16
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值