文章目录


前言

当我们使用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!在此谢谢大家了!

GitHub 加速计划 / ar / Aria
1
3
下载
下载可以很简单
最近提交(Master分支:4 个月前 )
b0d3c6dd - 6 个月前
8fd9634d - 6 个月前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐