Visual Studio编辑器中C4996 ‘scanf‘: This function or variable may be unsafe.问题解决方案

目录

​编辑

题目:简单的a+b

1.  题目描述

2.  输入格式

3.  输出格式

4.  样例输入

5.  样例输出

6.  解题思路

7.  代码示例

8.  报错解决

方案一

方案二

方案三

方案四

总结


题目:简单的a+b

1.  题目描述

输入两个整数a和b,计算a+b的和

本题很简单,但是注意此题是多组测试数据,即需要不停的接收系统的测试输入,你都可以计算结果并输出

2.  输入格式

输入两个整数A和B

范围不超过2^10

3.  输出格式

求A+B

4.  样例输入

1 1
10 20

5.  样例输出

2
30

6.  解题思路

首先,本题的首要条件是“需要不停的接收系统的测试输入,你都可以计算结果并输出”

我们可以通过while循环,不断地输入数据,进行条件判断执行

注:while(表达式){若干语句}//循环语句及其格式,若表达式里的语句成立,执行若干语句

而如何进行输入,就需要用到scanf语句

注:scanf("输入模式",地址列表);//输入语句及其格式。注:地址列表一定要加取地址符号&,如:&a,&b

而输入完对于输入语句的计算以及输出,我们可以直接在printf里执行

注:printf("输出模式",输出列表);//输出语句及其格式。注:输出模式和输出列表一一对应,如:printf("%d%d",a,b);

7.  代码示例

#include<stdio.h>
int main()
{int a=0,b=0;while(~scanf("%d%d", &a, &b))   {printf("%d\n",a+b);}    return 0;
}

想要退出循环,按下Ctrl+Z,回车才会退出循环,可能需要多循环几次

其中需要注意的一点是,在Visual Studio编辑器中可能会出现报错

'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.	Project16	D:\Visual Studio\project\Project16\Project16\FileName.cpp	5	

8.  报错解决

这里我们有两种解决方案:

方案一

将scanf改为scanf_s

#include<stdio.h>
int main()
{int a = 0, b = 0;while (~scanf_s("%d%d", &a, &b))   {printf("%d\n", a + b);}return 0;
}

        将 scanf 函数改为 scanf_s 函数的作用是增加输入的安全性,防止发生缓冲区溢出的问题。scanf_s 是 Microsoft 提供的安全版本的输入函数,相比于 scanf,它会在读取数据时进行一些额外的检查,并限制输入的字符数量。

        使用 scanf 函数时,如果输入的数据长度超过了目标变量所能容纳的大小,就可能导致缓冲区溢出,造成安全隐患。而 scanf_s 函数在读取数据时,可以指定目标变量所能接收的最大字符数量,从而避免缓冲区溢出的情况。

scanf_s 的函数签名如下:

int scanf_s(const char *format, ...);

        与 scanf 不同的是,scanf_s 在读取字符串时需要指定字符串的最大长度,以确保输入不会超出缓冲区的大小。比如,使用 scanf_s 读取一个字符串时,可以这样写:

char str[20];
scanf_s("%19s", str, sizeof(str));

        在上述代码中,限定了输入的字符串长度最多为 19 个字符(因为数组大小是 20,还要留一个字符给字符串结尾的空字符)。这样做可以防止用户输入超过目标变量所能容纳的字符数量。

        总之,通过使用 scanf_s 函数,我们可以增加输入操作的安全性,防止发生缓冲区溢出的问题。然而,需要注意的是,scanf_s 是 Microsoft 特定的函数,在其他编译器中可能不被支持。因此,在使用 scanf_s 时应该注意兼容性问题。

方案二

在代码最上方加:

#define _CRT_SECURE_NO_WARNINGS
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>int main()
{int a = 0, b = 0;while (~scanf("%d%d", &a, &b))   {printf("%d\n", a + b);}return 0;
}

        记住一定是在代码的最上方加,否则依旧报错,因为预处理指令是在编译器开始编译之前执行的。而编译器是按照源代码的顺序逐行读取和编译代码的,因此如果 #define _CRT_SECURE_NO_WARNINGS 放在其他代码之后,那么编译器可能会在处理到某些不安全的函数时已经发出了警告信息,从而无法起到禁用警告的效果。

   #define _CRT_SECURE_NO_WARNINGS 是一条预处理指令(preprocessor directive),在 C 语言编程中常用于禁用特定编译器警告信息。

        在 Microsoft Visual Studio 编译器中,使用一些被认为不安全的函数(如 fopenscanf 等)时,编译器会发出警告。这些警告是为了提醒开发者使用更安全的函数或者采取更安全的方法,以避免潜在的安全问题(如缓冲区溢出)。

        然而,在某些情况下,我们可能需要继续使用这些被标记为不安全的函数,例如在旧代码的迁移过程中或者与其他平台进行兼容性开发时。此时,#define _CRT_SECURE_NO_WARNINGS 可以用来禁用这些特定警告,使得编译器不再产生相关的警告信息。

        通过包含该预处理指令,我们告诉编译器不要发出与安全问题相关的警告,这样在编译时就不会看到相关的警告信息了。但需要注意的是,禁用这些警告并不会改变函数的行为,因此在使用这些函数时仍然需要谨慎确保输入的安全性。

        需要强调的是,禁用编译器警告可能会导致潜在的安全问题被忽略,因此在使用 #define _CRT_SECURE_NO_WARNINGS 时需要权衡利弊,并尽可能采取更安全的函数或方法来处理相应的问题。

方案三

在代码最上方加:

#define _CRT_SECURE_NO_DEPRECATE
#define _CRT_SECURE_NO_DEPRECATE
#include<stdio.h>int main()
{int a = 0, b = 0;while (~scanf("%d%d", &a, &b))   {printf("%d\n", a + b);}return 0;
}

        放到最上方的原因同方案二

  #define _CRT_SECURE_NO_DEPRECATE 是一条预处理指令(preprocessor directive),在 C 语言编程中常用于禁用某些特定函数的警告信息,具体来说,它可以用来避免使用已经被VS 标记为不安全的函数时产生的编译器警告。

        例如,在使用 fopen 函数时,如果不使用 _CRT_SECURE_NO_DEPRECATE,则可能会出现类似以下的编译器提示:

warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead.

        这是因为在Visual Studio中,许多标准 C 库函数被认为是不安全的,因为它们可能会受到缓冲区溢出等安全问题的影响。因此,为了更好地保护程序的安全性,Microsoft 建议使用相应的安全函数替代这些不安全的函数。

        然而,对于一些旧的代码或者遗留系统,可能难以修改所有不安全函数的调用。在这种情况下,我们可以使用 _CRT_SECURE_NO_DEPRECATE 来禁用编译器警告,从而继续使用这些不安全的函数。

        需要注意的是,使用 _CRT_SECURE_NO_DEPRECATE 可能会降低程序的安全性,因此在使用时要谨慎权衡利弊,并尽可能使用更安全的函数或方法来处理相应的问题。

方案四

在代码上方加:

#pragma warning(disable:4996)
#pragma warning(disable:4996)
#include<stdio.h>int main()
{int a = 0, b = 0;while (~scanf("%d%d", &a, &b))   {printf("%d\n", a + b);}return 0;
}

   #pragma warning(disable:4996) 是一条预处理指令(preprocessor directive),用来禁用编译器产生与函数安全问题相关的警告信息。这个警告通常出现在使用一些被标记为不安全的函数时,例如 scanfstrcpy 等。警告的代码是 C4996

        在 Visual Studio 中,这些函数通常被标记为不安全,因为它们可能导致缓冲区溢出等安全问题。因此,编译器会发出警告信息,提醒开发者使用更安全的函数或方法。

        但是,在某些情况下,我们需要继续使用这些被标记为不安全的函数,例如在旧代码的迁移过程中或者与其他平台进行兼容性开发时。此时,#pragma warning(disable:4996) 可以用来禁用这个特定的警告,使得编译器不再产生相关的警告信息。

        通过包含该预处理指令,我们告诉编译器不要发出与安全问题相关的警告,这样在编译时就不会看到相关的警告信息了。但需要注意的是,禁用这些警告并不会改变函数的行为,因此在使用这些函数时仍然需要谨慎确保输入的安全性。

        需要注意的是,#pragma warning(disable:4996) 只是针对 Visual Studio 编译器有效,如果使用其他编译器,可能需要使用不同的预处理指令或者参数。

        总之,#pragma warning(disable:4996) 用于禁用与函数安全问题相关的警告,可以帮助我们在某些情况下继续使用被标记为不安全的函数。但是,禁用编译器警告可能会导致潜在的安全问题被忽略,因此在使用 #pragma warning(disable:4996) 时需要权衡利弊,并尽可能采取更安全的函数或方法来处理相应的问题。

总结

方案一:将scanf改为scanf_s

方案二:在代码最上方加:#define _CRT_SECURE_NO_WARNINGS

方案三:在代码最上方加:#define _CRT_SECURE_NO_DEPRECATE

方案四:在代码上方加:#pragma warning(disable:4996)

简单来说,编译器看不到错我,我就是对的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/218390.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

杰发科技AC7840——CAN通信简介(1)

简介 7840支持4路CAN-FD Demo调试 官网下载demo&#xff0c;烧录&#xff0c;打开串口发现打印如下。原因是没有连接CAN盒子&#xff0c;总线错误。 CAN收发器端波形 CAN_L有信号&#xff0c;CAN_H没有 波形放大 GPIO端波形 有持续波形输出 波形放大查看&#xff0c;有50U…

深入理解人工智能中的图神经网络:原理、应用与未来展望

导言&#xff1a; 图神经网络&#xff08;Graph Neural Networks, GNNs&#xff09;作为人工智能领域的一项前沿技术&#xff0c;在社交网络分析、推荐系统、生物信息学等多个领域展现出卓越的性能。本文将深入剖析图神经网络的原理、当前应用场景以及未来可能的发展方向。 1.…

认识产品经理以及Axure简单安装与入门

目录 一.认识产品经理 1.1.项目团队 1.2.概述 1.3.认识产品经理 1.4.产品经理工作范围 1.5.产品经理工作流程 1.6.产品经理的职责 1.7.产品经理的分类 1.8.产品经理能力要求 1.9.产品工具 1.10.产品体验报告 二.Axure简介 三.应用场景 四.安装与汉化 4.1.安装 4…

神经网络是如何工作的? | 京东云技术团队

作为一名程序员&#xff0c;我们习惯于去了解所使用工具、中间件的底层原理&#xff0c;本文则旨在帮助大家了解AI模型的底层机制&#xff0c;让大家在学习或应用各种大模型时更加得心应手&#xff0c;更加适合没有AI基础的小伙伴们。 一、GPT与神经网络的关系 GPT想必大家已…

1.6 实战:Postman请求Get接口-获取用于登录的图形验证码

上一小节我们学习了Postman的布局,对Postman有了一个整体的认知,本小节我们就来实操一下Get接口。 我们打开Postman,点击我们之前创建的请求”获取登录页验证码“。我们在地址栏里填入获取登录页验证码的接口地址。怎么查看这个接口地址呢?我们打开校园二手交易系统,打开…

【Spring】00 入门指南

文章目录 1.简介2.概念1&#xff09;控制反转&#xff08;IoC&#xff09;2&#xff09;依赖注入&#xff08;DI&#xff09; 3.核心模块1&#xff09;Spring Core2&#xff09;Spring AOP3&#xff09;Spring MVC4&#xff09;Spring Data5&#xff09;Spring Boot 4.编写 Hel…

极速学习SSM之SpringMVC笔记

文章目录 一、SpringMVC简介1、什么是MVC2、什么是SpringMVC3、SpringMVC的特点 二、HelloWorld1、开发环境2、创建maven工程a>添加web模块b>打包方式&#xff1a;warc>引入依赖 3、配置web.xmla>默认配置方式b>扩展配置方式 4、创建请求控制器5、创建springMVC…

CSS的盒子模型(重点)

网页布局的三大核心&#xff1a;盒子模型、浮动、定位 网页布局的过程&#xff1a; 1. 先准备好相关的网页元素&#xff0c;网页元素基本都是盒子 Box 。 2. 利用 CSS 设置好盒子样式&#xff0c;然后摆放到相应位置。 3. 往盒子里面装内容.网页布局的核心本质&#xff1a; 就…

掌握魔法绘制图片、PDF剪辑器功能,智能生成AI文章,高效工作从此开始

在这个信息爆炸的时代&#xff0c;如何高效地处理和利用各种文件格式成为了我们日常工作的关键。今天&#xff0c;我们将为您介绍一款强大的工具&#xff0c;它能够智能生成AI文章&#xff0c;高效掌握魔法绘制图片和PDF剪辑器功能&#xff0c;为您的工作带来前所未有的便捷和高…

互联网加竞赛 python+opencv+机器学习车牌识别

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于机器学习的车牌识别系统 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;4分工作量&#xff1a;4分创新点&#xff1a;3分 该项目较为新颖&#xff0c;适…

解决:AttributeError: ‘dict’ object has no attribute ‘has_key’

解决&#xff1a;AttributeError: ‘dict’ object has no attribute ‘has_key’ 文章目录 解决&#xff1a;AttributeError: dict object has no attribute has_key背景报错问题报错翻译报错位置代码报错原因解决方法方法一方法二方法三今天的分享就到此结束了 背景 在使用之…

java导出word使用模版与自定义联合出击解决复杂表格!

1. 看一下需要导出什么样子的表格 如图所示&#xff0c;这里的所有数据行都是动态的&#xff0c;需要根据查询出来的数据循环展示。 如果只是这样的话&#xff0c;使用freemarker应该都可以搞定&#xff0c;但是他一列中内容相同的单元格&#xff0c;需要合并。 这对于表格样式…

Cosmopolitan Libc:让 C 语言一次构建、随处运行 | 开源日报 No.109

jart/cosmopolitan Stars: 12.9k License: ISC Cosmopolitan Libc 使 C 成为一种构建一次运行在任何地方的语言&#xff0c;就像 Java 一样&#xff0c;但它不需要解释器或虚拟机。相反&#xff0c;它重新配置了标准 GCC 和 Clang 以输出符合 POSIX 标准的多语言格式&#xff…

MySQL的事务以及springboot中如何使用事务

事务的四大特性&#xff1a; 概念&#xff1a; 事务 是一组操作的集合&#xff0c;它是不可分割的工作单元。事务会把所有操作作为一个整体&#xff0c;一起向系统提交或撤销操作请求&#xff0c;即这些操作要么同时成功&#xff0c;要么同时失败。 注意&#xff1a; 默认MySQ…

【网络安全】HTTP Slowloris攻击原理解析

文章目录 Slowloris攻击的概念Slowloris攻击原理Slowloris攻击的步骤其他的DDoS攻击类型UDP FloodICMP (Ping) FloodSYN FloodPing of DeathNTP AmplificationHTTP FloodZero-day DDoS 攻击 推荐阅读 Slowloris攻击的概念 Slowloris是在2009年由著名Web安全专家RSnake提出的一…

教育数字化转型 赋能家庭场景自主学习习惯养成

北京市气象台12月12日22时升级发布暴雪橙色预警信号&#xff0c;北京市教委决定自12月13日开始&#xff0c;全市中小学幼儿园采取学生临时居家学习措施。自疫情以来&#xff0c;家庭已经成为另一个学习中心&#xff0c;学校不再是教育的孤岛。 学习方式的变革&#xff0c;数字…

Etcd实战(二)-k8s集群中Etcd数据存储

1 介绍 k8s中所有对象的manifest都需要保存到某个地方&#xff0c;这样他们的manifest在api server重启和失败的时候才不会丢失&#xff0c;因此引入了etcd。在k8s中只有api server和etcd直接交互&#xff0c;其它组件都通过api server间接和etcd交互&#xff0c;这样做的好处…

目标检测锚框

目标检测锚框 最开始呢&#xff0c;我们需要先介绍一下框&#xff0c;先学会一下怎么画框 导入所需要的包 from PIL import Image import d2lzh_pytorch as d2l import numpy as np import math import torch展示一下本次实验我们用到的图像&#xff0c;猫狗 d2l.set_figsiz…

python自动化测试实战 —— WebDriver API的使用

软件测试专栏 感兴趣可看&#xff1a;软件测试专栏 自动化测试学习部分源码 python自动化测试相关知识&#xff1a; 【如何学习Python自动化测试】—— 自动化测试环境搭建 【如何学习python自动化测试】—— 浏览器驱动的安装 以及 如何更…

Linux shell编程学习笔记35:seq

0 前言 在使用 for 循环语句时&#xff0c;我们经常使用到序列。比如&#xff1a; for i in 1 2 3 4 5 6 7 8 9 10; do echo "$i * 2 $(expr $i \* 2)"; done 其中的 1 2 3 4 5 6 7 8 9 10;就是一个整数序列 。 为了方便我们使用数字序列&#xff0c;Linux提供了…