文章目录
1、问题描述
#include <stdio.h>
int main()
{
int n;
scanf("%d", &n);
return 0;
}
上面的代码语法中没有任何问题,但在vs中使用scanf,编译不通过,提示信息如下图:
2、报错原因
2.1、scanf和scanf-s的区别
- scanf()函数是标准C中提供的标准输入函数,用以用户输入数据
- scanf_s()函数是Microsoft公司VS开发工具提供的一个功能相同的安全标准输入函数,从vc++2005开始,VS系统提供了scanf_s()。在调用该函数时,必须提供一个数字以表明最多读取多少位字符。
2.2、scanf为什么不安全
- scanf()在读取数据时不检查边界,所以可能会造成内存访问越界:
//例如:分配了5字节的空间但是用户输入了10字节,就会导致scanf()读到10个字节
char buf[5]={
'\0'};
scanf("%s", buf);
//如果输入1234567890,则5以后的部分会被写到别的变量所在的空间上去,从而可能会导致程序运行异常。
2.3、scanf_s为什么安全
char buf[5]={
'\0'};
scanf_s("%s",buf,5); //最多读取4个字符,因为buf[4]要放'\0'
//如果输入1234567890,则buf只会接受前4个字符
2.4、用scanf还是scanf_s
- scanf_s虽然安全,但不通用
- scanf-s是微软公司出的vs所提供的,别的编译软件并没有这个东西,如果scanf全部改成scanf_s,其他编译器将有可以无法编译通过。
3、VS中使用scanf如何通过编译
3.1、临时禁用安全检查
使用这种方法只能保证当前有效,后面再开的程序仍然会安全检查
- 右击项目,选择属性
- 【配置属性】 --【C/C++】 --【代码生成】–【安全性检查】,选择【禁用安全性检查】
3.1、永久禁用安全检查
报错提示中有你会发现有下面这个内容:
_CRT_SECURE_NO_WARNINGS
- 打开VS安装目录,找到
newc++file.cpp
(VS版本不一样路径也不一样,可以搜索一下这个文件)
- 加入下面这段代码
#define _CRT_SECURE_NO_WARNINGS 1
之后你创建的所有项目开始就会有这一句话,你在这句话下边再正常编写你的代码就可以了。