VS系列编译器对函数不安全报错的几种解决方法

hallo,这里是白糖拌饭!

今天我将为大家总结两种关于VS系列编译器对函数不安全报错的解决方案。


目录

vs2019经常提示函数不安全(报错、警告)的原因

解决方案:

1、定义预定义符号:_CRT_SECURE_NO_WARNINGS

2、设置项目属性的预处理

补充:


vs2019经常提示函数不安全(报错、警告)的原因

刚接触C语言的我们会发现,VS报错不能使用 scanf 函数

错误提示信息:

错误    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.     

 如图所示:

VS系列编译器对函数不安全报错的几种解决方法_第1张图片

 我们经常得到一个C4996的错误。解决这个问题之前我们先来了解一下为什么会出现这个情况。

其实,除了 scanf 函数之外VS还会对其他几个函数报错

strcpy

strcat

sscanf

fopen

...

 这些函数都是不安全的函数。

当我运行这样一行代码:

#include "stdio.h"
int main()
{
	char a[5] = { 0 };
	scanf("%s", a);
	printf("%s", a);
	return 0;
}

 其中我定义了五个字符的数组,当我输入的时候超过五个字符时会怎么样?如图:

VS系列编译器对函数不安全报错的几种解决方法_第2张图片

这时,系统就会报错,其原因是输入的字符大于五个所占空间被破坏,多余的部分越界访问了 ,程序崩溃。这时我们不难发现,这个 scanf 函数去读取的时候压根不去考虑‘a’是否会放得下,你给我多少我就录入多少,录入之后就开始直接打印了,这时候程序就会出现崩溃。从这个角度来说,这个函数不安全。 

解决方案:

1、定义预定义符号:_CRT_SECURE_NO_WARNINGS

通过仔细阅读错误提示信息,我们可以发现:

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

    _CRT_SECURE_NO_WARNINGS . 

         所以,你可以直接将 scanf 替换成 scanf_s 或者你只需在你使用不安全函数的源文件(.c)文件的第一行加上一句:

#define _CRT_SECURE_NO_WARNINGS 1

如下:

#define _CRT_SECURE_NO_WARNINGS 1

#include "stdio.h"
int main()
{
	char a[5] = { 0 };
	scanf("%s", a);
	printf("%s", a);
	return 0;
}

         注:在这说明一下为什么不适用 scanf_s 函数,scanf_s 函数是VS系列编译器所特有的,如果你的代码中使用了这个函数,则你的代码放在gcc编译器下编译是不能识别 scanf_s 函数的,这样,你的代码就不具备跨平台性。

斯。。。。。。这样我们每一次在.c文件中写代码第一行都要加上这一句,有点麻烦啊。 

别急,这里有一个一劳永逸的办法,可以让每一次新建的源文件中都包含这样一句代码。

在VS的安装路径下搜索: newc++file.cpp 这个文件,在文件上加入:

#define _CRT_SECURE_NO_WARNINGS 1

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

具体步骤:

在VS安装路径下找到此文件,并使用Notepad++软件打开

VS系列编译器对函数不安全报错的几种解决方法_第3张图片

 在文件中输入刚刚提到的代码,并使用管理员模式启动保存

VS系列编译器对函数不安全报错的几种解决方法_第4张图片

   注: 在不同版本的VS环境下的 newc++file.cpp这个文件的位置不同,就也可能存在多个,建议多尝试几次。

2、设置项目属性的预处理

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

        右击项目名称->点击属性

VS系列编译器对函数不安全报错的几种解决方法_第5张图片

         在属性界面中:

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

_CRT_SECURE_NO_WARNINGS 1

 VS系列编译器对函数不安全报错的几种解决方法_第6张图片

 两段代码间用分号分开。 

补充:

最后,关于 scanf 与 scanf_s 函数我想提一下。

scanf 函数是标准C中提供的输入函数,用以用户输入数据;scanf_s 函数是Micorosoft公司VS开发工具提供的一个功能相同的安全标准输入函数,从VC++2005开始,VS系统就提供了 scanf_s 函数;在调用此函式时,必须提供一个数字表明最多读取多少位字符。scanf 函数在读取数据时不会检查边界,所以有时会造成内存访问越界,从而产生警告。


今天的分享就到这里,欢迎大家交流。

(本人是一个刚学习C语言的小白,如文章内有错误,请加以斧正)

你可能感兴趣的:(编译器)