前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >vs2019中scanf返回值被忽略_vs2017scanf

vs2019中scanf返回值被忽略_vs2017scanf

作者头像
全栈程序员站长
发布于 2022-11-17 05:34:13
发布于 2022-11-17 05:34:13
1.2K00
代码可运行
举报
运行总次数:0
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

一、问题再现

如下是笔者在学习数据结构中的二叉树时遇到的问题:

报错警告:返回值被忽略:”scanf”。

二、问题分析

百度一下之后大致原因是:scanf()函数在读取时不检查边界,所以可能会造成内存泄漏。有一定的安全隐患。例如代码是

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
char a;
scanf("%c",&a);

scanf只有一个%c,当你输入两个以上的字符时,就会发生内存溢出。

微软公司觉得其不安全,所以在VS编译器中提供了scanf_s()函数,这是VS编译器特有的函数。强制用户提升安全性,如果想要在VS中使用scanf()函数,则可以通过以下四种方法解决。

三、解决方案

1、把scanf改成:scanf_s

把所有的scanf()改写成scanf_s(),但是scanf_s()是VS编译器特有的函数,写了此函数之后在别的编译器上就无法执行,使得代码的可移植性和跨平台性变得极差,不推荐使用。

2、关闭VS的SDL安全检查

点击应用确定之后,程序正常运行

3、在程序开头添加命令

在程序开头添加

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#pragma warning(disable:4996)

或者

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#pragma warning(once:4996)

可以看到,程序已经可以正确运行,即使警告提示还有。

4、添加宏定义

在项目文件开头添加宏定义,来忽略安全检查

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#define _CRT_SECURE_NO_WARNINGS

或者

在预处理中编辑宏,相当于每次执行程序时,编译器自动帮你执行,省去了自己要在文件开头定义宏的麻烦

又或者

在VS2019安装路径找到 “newc++file.cpp” 这个文件,右键记事本打开,输入上面的

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#define _CRT_SECURE_NO_WARNINGS

命令,保存,这样以后每次新建.c++源文件的时候这行代码就会自动出现在第一行。

【注意】如果在保存的时候出现“拒绝访问”的情况,可以测试下载安装一个工具“Notepad++”,然后以管理员的身份运行这个软件,用这个软件打开上面提到的“newc++file.cpp”文件,复制粘贴代码上去后,保存即可。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/234268.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年11月3日 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、问题再现
  • 二、问题分析
  • 三、解决方案
    • 1、把scanf改成:scanf_s
    • 2、关闭VS的SDL安全检查
    • 3、在程序开头添加命令
    • 4、添加宏定义
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档