IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> VS系列编译器对函数不安全报错的几种解决方法 -> 正文阅读

[C++知识库]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.? ? ?

?如图所示:

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

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

strcpy

strcat

sscanf

fopen

...

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

当我运行这样一行代码:

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

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

这时,系统就会报错,其原因是输入的字符大于五个所占空间被破坏,多余的部分越界访问了?,程序崩溃。这时我们不难发现,这个 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环境下的 newc++file.cpp这个文件的位置不同,就也可能存在多个,建议多尝试几次。

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

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

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

? ? ? ? ?在属性界面中:

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

_CRT_SECURE_NO_WARNINGS 1

?

?两段代码间用分号分开。?

补充:

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

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


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

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

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-06 09:26:01  更:2021-08-06 09:27:16 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/13 9:47:10-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码