VS提示scanf不安全


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

在这里插入图片描述
之后你创建的所有项目开始就会有这一句话,你在这句话下边再正常编写你的代码就可以了。

猜你喜欢

转载自blog.csdn.net/chuhe163/article/details/103707037
今日推荐