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