Visual Studio对不安全函数的报错——C4996错误

C4996 “scanf“ 问题——初学者使用VS的拦路虎 微软的VS系列编译器号称地表最强集成开发环境(IDE),现在已经更新到了2022版,丰富的功能和高级的界面,对于学校里用的VC++ 6.0简直是降维打击,很多追求优质编码环境的同学可能都会去网上找到VS的资源,然后安装使用,当一切环境准备就绪时,发现涉及到使用 scanf 的代码无法编译,再三检查后发现代码没有任何问题,一时间甚至会怀疑自己是不是下错了编译器。其实没有,这是一个很常见的报错,也是所有想用VS的同学必过的一道坎。下面让我来教大家如何跨过这道坎:... 阅读详情
AI摘要

Visual Studio编译C语言时常见C4996错误,源于scanf、gets等函数缺乏安全检查,易导致缓冲区溢出。微软提供如scanf_s等安全替代函数,并可通过预处理器定义、关闭SDL检查等方式屏蔽警告,提升程序安全性。

报错信息

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.	
Project1	F:\VS_Project\Project1\hello.c	15		

“scanf”:此函数或变量可能不安全。考虑改用scanf_S。要禁用弃用,
请使用_CRT_SECURE_NO_WARNINGS。有关详细信息,请参阅联机帮助

解释:VS认为C中的部分函数不安全,就推荐使用自己的函数代替。

原因

根本原因:C语言的函数不够严谨,没有做安全检查。

#include <stdio.h>


int main() {

    char str[6] = { 0 };
    scanf("%s", str);
    return 0;
    
}

 我们以上述代码为例子,就是定义一个字符数组str,用scanf 将敲的内容输入到 str 的数组里。

C语言是没有字符串这个类型的,字符串存在字符数组里

str 定义的数组是6个大小,scanf() 在读取字符串时不会检查字符个数,它不知道数组或缓冲区到底能容纳多少个字符,当输入过多的时候程序就崩溃了,这就是所谓的不安全函数。尤其是这种错误只能等到程序运行时才能检测出来,在编译期间根本无法检测;一旦检测出来只有一种后果,就是程序被操作系统终止,也就是我们常说的“程序崩溃”。

scanf()、gets()、fgets_s()、strcpy()、strcat()等都是C语言自带的定语字符操作的函数,它们都是标准函数,但是它们都有一个缺陷,就是不安全,可能会导致数组溢出或者缓冲区溢出,可以通过  "缓冲区溢出"  来进行攻击。

scanf_s()、gets_s()、fgets_s()、strcpy_s()、strcat_s() 是微软发明的安全函数,它们仅适用于 VS,在其它编译器下无效。这些安全函数在读取或操作字符串时要求指明长度,这样一来,过多的字符就会被过滤掉,避免了数组或者缓冲区溢出。

解决方法

方法一

方法一是最简单的方法,就是在代码的第一行加一个预处理。

#define _CRT_SECURE_NO_WARNINGS 1
//定义_CRT_SECURE_NO_WARNINGS这个是1(真)

缺点是每次写C文件都需要这么添加一次!

方法二

方法二就是使用微软发明的安全函数。

scanf_s() 的最后一个参数用来指明数组或者缓冲区的大小,假设它的值为 n,那么最多只允许读取 n-1 个字符(因为最后要存储 ’\0’ 结束符),多出来的字符就不再读取了,这样就可以避免读入过多的字符。

char str[4] = {0};
scanf_s("%s", str,4);

//缺点:比如跨平台性不好,scanf_s这个函数在别的编译器就运行不了

 方法三

方法三就是自定义预处理器

在项目-->属性-->C/C++-->预处理器-->预处理器定义(分号代表多个定义,将_CRT_SECURE_NO_WARNINGS复制进去)应用即可。

 

方法四

方法四就是取消安全检查

在C文件-->属性-->C/C++-->SDL检查(改为否就行),虽然运行的时候程序会有警告,但是不影响运行。就是把VS的安全警告取消了。

方法五

方法五就是修改newc++file.cpp文件

首先我们需要找见VS的安装位置,在桌面快捷方式右键,点击打开文件所在位置。

这样,我们就找见了VS的安装位置,然后 VC-->vcprojectitems-->newc++file.cpp。

找见 newc++file.cpp文件,右键记事本打开,在第一行写入

#define _CRT_SECURE_NO_WARNINGS 1 

保存即可,那么下一次登录VS,创建.c文件的时候,VS就会自动帮我们在第一行写入

#define _CRT_SECURE_NO_WARNINGS 1 

在用记事本打开newc++file.cpp文件,可能会提示权限不够,解决方法就是提高当前系统登录用户的权限。具体操作如下:右键——属性——安全——编辑——点击当前系统用户——允许完全控制。

新手编程常见问题:C4996警告 C4996是VS编译器的一个警告代码,表示在该程序中使用了被标记为不安全或已被弃用的函数。这些函数可能是过时的,或者在未来版本的库中可能会被删除。新手在使用最新一版VS2022时会遇到一些常见问题,VS与学校练习使用的VC之间有诸多不同,会发生一些兼容性设置的问题。由于VS编译器对安全性的考虑,对scanf等一系列函数增加了安全性检验,不仅是scanf函数,还包括了含字符串操作函数、文件处理操作函数等。PS:scanf_s()函数是VS自带的函数,其他编译器不支持、不跨平台。 阅读详情

相关推荐

关于 _CRT_SECURE_NO_WARNINGS

vs系列的IDE中,使用scanf等函数会收到编译器警告warning 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 ...

lin5161678的专栏 2376

vs中scanf函数报错c4996说明及解决方案

c4996

weixin_63655385的博客 5392

【编译器】使用Visual Studio编写C语言程序(附若干错误解决方案)

本文通过图文结合的方式,介绍了Windows10下怎样使用Visual Studio 2015编写C语言程序,并附有若干问题的解决方案。文章将会不定期更新。欢迎大家与我交流。

bit_thinkind的博客 7038

VS出现C4996的意思以及解决方法

C4996的意思以及解决办法

XZshijian的博客 1万+

Visual Studio 版本的判断

Visual Studio 2015: V140              14.00                   Visual Studio 2015 MSVC++ 12.0 _MSC_VER == 1800 (Visual Studio 2013)  MSVC++ 11.0 _MSC_VER == 1700 (Visual Studio 2012)  MSVC+

h a 6 6 6 c k 为 你解决复杂难题! 3655

STC8H单片机ADC实战:从读取电位器到串口绘图,12位精度玩起来

本文详细介绍了STC8H单片机的ADC功能实战应用,从读取电位器到串口绘图,展示了12位精度的实现方法。通过硬件连接、代码配置、串口数据传输及高级优化技巧,帮助开发者快速掌握ADC模块的使用,适用于各种传感器数据采集和信号处理场景。

weixin_28278377的博客 344

C语言中unsafe的错误,关于C代码报不安全的时候怎么办?我是在vs2015中运行的,像c#中那样在语句前加unsafe{}不好使啊。...

报错信息:严重性代码说明项目文件行禁止显示状态错误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.struc_a...

weixin_42531396的博客 448

模拟IC设计笔记:拆解一个经典的时钟占空比校正(DCC)电路模块,从理论到SPICE仿真

本文深入解析了时钟占空比校正(DCC)电路在模拟IC设计中的关键作用,特别是在高速ADC应用中。通过晶体管级拆解,详细介绍了基于电荷泵和积分器的模拟反馈型DCC电路设计,包括占空比检测、误差放大与校正执行单元的实现。文章还提供了SPICE仿真验证方法,确保电路在100MHz时钟下的稳定性和性能。

weixin_33725722的博客 428

C语言visual studio初学者拦路虎BUG

本章中主要介绍了VS中出现的C4996的错误原因以及解决办法,如果你学会了解决C4996的办法,不妨在自己的电脑也试一下,成功了的话要是你的其他同学也遇到了一样的问题不妨帮帮他解决一下,如果有表达或编写不好的地方,希望大家能指出,我们大家一起进步喔!

ISO_king的博客 247

别再手动续期SSL证书了!用acme.sh配合阿里云DNS API,实现全自动HTTPS证书管理

本文详细介绍了如何使用acme.sh配合阿里云DNS API实现SSL/TLS证书的全自动管理,彻底解决手动续期带来的风险与不便。通过自动化部署流程,包括环境准备、API集成、多域名证书申请等关键步骤,帮助运维人员构建高效、可靠的HTTPS证书管理体系,显著提升安全性和运维效率。

weixin_29200485的博客 269

分析攻击流量样本

利用wireshark分析.pcap攻击样本的攻击流程,利用漏洞等。

一段旅途 6844

Visual Studio中scanf报错C4996详解:原因与四大解决方案

在C语言开发过程中,Visual Studio编译环境常将部分存在安全隐患的函数调用标记为C4996警告,并默认升级为编译错误,初学者往往因scanf报错而中断学习。C4996本质上是编译器对缓冲区溢出风险的预警机制,scanf等函数缺少长度限制,容易造成内存越界。理解这一原理后,可通过定义_CRT_SECURE_NO_WARNINGS屏蔽警告、关闭SDL检查、改用scanf_s或采用fgets配合sscanf等方式处理。不同方案在代码改动量、安全性与可移植性上各有取舍:学习阶段快速验证可选屏蔽方式,Win

weixin_34101229的博客 177

MAPPO实战:从理论到代码的协作智能体训练指南

本文详细介绍了MAPPO算法在多智能体协作训练中的实战应用,从理论基础到代码实现全面解析。通过对比PPO与MAPPO的差异,深入讲解CTDE框架、网络架构设计、参数调优等关键环节,并提供实际项目中的调参经验和常见问题解决方案,帮助开发者快速掌握这一强化学习前沿技术。

weixin_42561040的博客 265

用Visual Studio编写c语言报错C4996 该如何解决

今天在用VS写C语言时,编译器报错C4996; 此函数或变量可能不安全。请考虑使用safe_version相反。若要禁用弃用,请使用 _CRT_SECURE_NO_WARNINGS。 我以前用DEV、CV6.0 "scanf "从键盘输入都OK 啊 怎么现在用起了Visual Studio2017就不行了呢?于是我又把代码复制粘贴到DEV ,一气呵成,编译过程就像德芙,纵想湿滑。再回来看看VS...

qq_42603181的博客 2944

绿米Aqara S1【妙控开关 S1E】版本降级或升级自定义固件的方法

绿米Aqara S1【妙控开关 S1E】版本降级或升级自定义固件的方法

LeeKwen的专栏 2171

【一看就会】autoware universe项目结构解析——从一层一层直到control源码

下载安装autoware universe花了一天。下载好之后,按照网上说的跑了一下仿真是能跑的,证明下的代码没问题。然后就得看一下各模块实现的源码了。但是当我打开这些文件的时候。我勒个豆。这么多是个玩意儿。我连该启动哪个launch文件,哪个文件夹是干啥的都不知道。在我慢慢弄懂之后,我也记录这个庞大的项目的各个文件夹和里面的文件以及项目,以及自己使用时应该启动哪些launch文件。这篇文章目的就是通过找到control部分的源码,来帮助我们梳理这个庞大项目的各个文件的功能。

weixin_48386130的博客 2037

VS中报错C4996 scanf错误&错误介绍&解决方案

在VS中,对于初学者来说存在一些各种意想不到的错误,但比较友好的是新版本中在报错的同时会指出错误地方。以下说说VS2019中 c4996 sacnf报错的解决方法。

m0_61146840的博客 1万+

支付域——账户系统设计

本文详细介绍了支付域中的账户系统设计,包括账户的定义、核心特征、常见类型以及在支付系统中的作用。账户是支付平台为用户、商户等主体建立的资金记录单元,具有资金归属、余额管理、交易流水、资金安全等核心特征。常见账户类型包括用户账户、商户账户、平台账户、保证金账户等。此外,还探讨了账户与银行账户的区别、账户的结构设计、如何设计账户类型以及账户系统设计等内容。

庄小焱 1189

Visual Studio编辑器 2019:scanf函数返回值被忽略(C4996)报错及四种解决办法

scanf()等函数存在于版本较旧的CRT(Cruntimelibrary,partoftheCstandardlibrary)中,具有安全性问题,比如在读取字符时,若不指定%s的宽度,可能会导致缓冲区溢出。VS编译器认为直接使用C语言定义的函数scanf()不检查边界,使用VS编辑器编写C语言代码时,调用。函数输入内容时候报错。错误代码C4996。...

m0_61409069的博客 6790

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

vs2019 中c4996错误解决方案

vs2019 中c4996错误解决方案 问题描述: 在使用vs创建c程序时,没有特殊宏定义,程序报错无法运行 问题产生原因: 由于微软在VS中不建议再使用C的传统库函数scanf,strcpy,sprintf等,所以直接使用这些库函数会提示C4996错误。 VS建议采用带_s的函数,如scanf_s、strcpy_s,但这些并不是标准C函数。 解决方案: 1.关闭SDL检查 右键项目文件→属性...

寅月十八的博客 5万+

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

【三种解决Visual Studio中scanf函数报错的方法】

本文剖析VS2022中 `scanf` 报错根源(C6031 忽略返回值、C4996 安全风险),详解三类方案:① 加宏快速关警告,简便但存溢出隐患;② 借 Everything 定位模板文件,修改后一劳永逸(附实操);③ 改用 `scanf_s`,需显式传缓冲区大小,却兼容性受限 。代码+步骤双指引,高效攻克编译难题。

Larry的博客 2479

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

error C4996错误分析

之前总是毫无规律地出现这个C4996的error,头文件添加#pragma warning(disable:4996)就可以解决,但是好奇为什么别人的程序就可以不加入这么low的一行,今天仔细搞明白吧~ Ps:本博客使用的是win7 vs2015 文章目录现象原因分析解决方案参考来源 现象 error C4996: ‘localtime’: This function or variable m...

Be busy living or busy dying 1708

C++错误:C4996

使用vs2015编译出现错误:error C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 原因:...

potxxx的博客 7646

VS中报错C4996 怎么办?

有遇到过这种错误吗?VS中报错C4996 其实这就是一些警告,但是如果你用了很多第三方的开源代码,你很难保证这些开源代码中使用的函数以及编码规范都遵循了VS最新的要求,所以很可能就会报错,注意时报错不是警告,怎么办?

skyksksksksks的博客 2388

Visual Studio(VS)中编译报错: 错误 C4996 ‘sprintf‘: This function or variable may be unsafe. Consider using

这个错误信息是一个编译器警告,它表示正在使用的 sprintf 函数可能不安全。可以通过另外一种方法解决这个问题,在属性中添加宏。如果希望禁用此警告,可以在代码中定义宏。添加好后再次运行编译即可解决该问题,冲冲冲!编译时报错提示:错误。

qq_40280673的博客 4596
上一篇: Python详细安装与环境搭建
下一篇: 认识Python
子夜四时歌
博客等级 码龄7年 164粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

子夜四时歌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值