VS2022中scanf报错,返回值被忽略,This function or variable may be unsafe.
文章目录
前言
当我们使用VS(我使用的是2022社区版)在编写C语言的时候,会经常使用到scanf()语句,我运行的时候可能编译器会报错,今天我就来聊聊为什么报错?怎么解决?
一、为什么编译器会报错?
想知道为什么会报错,我们首先要知道scanf()怎么处理用户的输入;
1 、scanf()处理用户的输入
scanf() 处理⽤⼾输⼊的原理是,⽤⼾的输⼊先放⼊缓存,等到按下回⻋键后,按照占位符对缓存
进⾏解读。
解读⽤⼾输⼊时,会从上⼀次解读遗留的第⼀个字符开始,直到读完缓存,或者遇到第⼀个不符合条件的字符为⽌。
2、 scanf()为什么不安全
我们再仔细看看VS编译器在错误列表给出的提示的第一句: 'scanf': This function or variable may be unsafe,意思是:这个功能或变量可能不安全。
我们来看看下面这个程序:
int main()
{
char arr[6] = { 0 };
scanf("%s",arr); //数组名就是地址
printf("%s\n",arr);
return 0;
}
运行结果是:
我们可以看到,输入一个大于最大范围的字符串,虽然报错,但还是打印出来!所以要想合理使用此函数,要注意输入的长度 。
3、 scanf_s()是什么?
VS编译器在错误列表给出的提示的第二句: Consider using scanf_s instead 即考虑使用scanf_s()代替;
scanf_s()其实是VS里定义的一个函数,scanf_s函数多了一个参数用于指定读取的最大字符数。这个参数是为了防止缓冲区溢出而引入的,可以有效地防止一些安全性问题。
此时最好不要用scanf_s()替换,因为scanf()是C语言标准库的,而scanf_s只有vs认识,所以考虑到代码的兼容性,我们一般不使用scanf_s();
二、怎么解决这个报错?
1、scanf_s()替换scanf()
即上面的第三点;
2、#define _CRT_SECURE_NO_WARNINGS
VS编译器在错误列表给出的提示的最后一句:use _CRT_SECURE_NO_WARNINGS. 即我们可以在程序上添加这么一句:
#define _CRT_SECURE_NO_WARNINGS
即可解决报错;
3、在.cpp文件中添加
一劳永逸的办法:
在vs上,所有的.c文件、.cpp文件的创建其实都是拷贝自同一个文件:
我们在磁盘中找到newc++file.cpp的文件;
在newc++file.cpp的文件中加上#define _CRT_SECURE_NO_WARNINGS
这时可能显示无法更改,这时我们将文件拖到桌面上更改,然后再拖回去,
但是,千万千万千万不要把这个文件删除或丢了,别问我怎么知道的!!!
总结
本文主要讲解了一下scanf()在VS中报错的问题,如有意见,评论、私信都ok!在此谢谢大家了!
更多推荐
所有评论(0)