vs2019中scanf返回值被忽略_vs2017scanf

2022-11-17 13:34:13 浏览数 (1)

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

一、问题再现

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

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

二、问题分析

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

代码语言:javascript复制
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复制
#pragma warning(disable:4996)

或者

代码语言:javascript复制
#pragma warning(once:4996)

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

4、添加宏定义

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

代码语言:javascript复制
#define _CRT_SECURE_NO_WARNINGS

或者

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

又或者

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

代码语言:javascript复制
#define _CRT_SECURE_NO_WARNINGS

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

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

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

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

0 人点赞