解决vs2019使用scanf函数不安全的问题

Everything安装

Everything是voidtools开发的一款文件搜索工具,官网描述为“基于名称实时定位文件和目录.它查找速度比在Windows上直接查找要快很多.待会要用它查找一个叫newc++file.cpp的文件.

点击查看安装包 提取码zcyy

VS下直接使用scanf 的问题

int main()
{
	int a = 0;
	scanf("%d", &a);
	return 0;
}

使用VS2019直接执行以上代码会报如下的错误:
在这里插入图片描述
错误信息表示sacnf函数不安全

解决方案1

直接使用报错信息里建议的scanf_s代替即可.

scanf_s(“%s”,arr,5),表示最多读取5-1=4个字符,因为arr[4]要放’\0’
scanf_s最后一个参数是缓冲区的大小,表示最多读取n-1个字符.
vc++2005/2008中提供了scanf_s(),在最新的VS2019中也提供了scanf_s()。在调用时,必须提供一个参数以表明最多读取多少位字符。

但这只是VS编译器自己提供的一种函数,并不是C语言的库函数,所以如果使用此方案在别的编译器可能编译无法通过,降低了代码的可移植性!
所以建议使用下面的解决方案2.

解决方案2

注意错误信息里的 _CRT_SECURE_NO_WARNINGS

希望使用scanf不报错,只需要在第一行写上:
#define _CRT_SECURE_NO_WARNINGS 1

不过如果每次新建源文件的时候都需要手动加上这句话的话,效率就会较低.这也有解决方法,就是利用everything查找到newc++file.cpp文件,并加上该条语句便一劳永逸了~

S1:选择打开路径
在这里插入图片描述

S2:添加语句
用记事本打开后写入#define _CRT_SECURE_NO_WARNINGS 1,但是保存的时候可能会出现如下情况:在这里插入图片描述

这个时候有一个巧妙的方法:
先将该文件复制到桌面,然后在桌面打开该文件,用记事本增添该语句后,再拖到原来的路径下,并选择替换目标文件.
在这里插入图片描述
保存后,再新建源文件的时候,就自动带有该语句了

为何sacnf不安全

用如下代码解释:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	char arr[4] = { 0 };
	scanf("%s", arr);//我输入aaaaaaa,明显溢出了
	printf("%s\n", arr);//但是仍然打印了aaaaaaa 强行放入了数组中
	//这个结果说明:scanf不会管是否已经越界访问,所以是不安全的
	return 0;
}

在这里插入图片描述

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值