VS2019:scanf返回值被忽略
一、问题再现如下是笔者在学习数据结构中的二叉树时遇到的问题:报错警告:返回值被忽略:"scanf"。二、问题分析百度一下之后大致原因是:scanf()函数在读取时不检查边界,所以可能会造成内存泄漏。有一定的安全隐患。微软公司觉得其不安全,所以在VS编译器中提供了scanf_s()函数,这是VS编译器特有的函数。强制用户提升安全性,如果想要在VS中使用scanf()函数,则可以通过一下4中方法解决。
一、问题再现
如下是笔者在学习数据结构中的二叉树时遇到的问题:
报错警告:返回值被忽略:"scanf"。
二、问题分析
百度一下之后大致原因是:scanf()函数在读取时不检查边界,所以可能会造成内存泄漏。有一定的安全隐患。例如代码是
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、在程序开头添加命令
在程序开头添加
#pragma warning(disable:4996)
或者
#pragma warning(once:4996)
可以看到,程序已经可以正确运行,即使警告提示还有。
4、添加宏定义
在项目文件开头添加宏定义,来忽略安全检查
#define _CRT_SECURE_NO_WARNINGS
或者
在预处理中编辑宏,相当于每次执行程序时,编译器自动帮你执行,省去了自己要在文件开头定义宏的麻烦
又或者
在VS2019安装路径找到 "newc++file.cpp" 这个文件,右键记事本打开,输入上面的
#define _CRT_SECURE_NO_WARNINGS
命令,保存,这样以后每次新建.c++源文件的时候这行代码就会自动出现在第一行。
【注意】如果在保存的时候出现“拒绝访问”的情况,可以测试下载安装一个工具“Notepad++”,然后以管理员的身份运行这个软件,用这个软件打开上面提到的“newc++file.cpp”文件,复制粘贴代码上去后,保存即可。
更多推荐
所有评论(0)