关于VS提示scanf不安全问题解决

 

 

#include<stdio.h>

#include<stdlib.h>

int main()

{

int m;

int n;

int i;

printf("请输入m的值\n");

scanf("%d", &m);

printf("请输入n的值\n");

scanf("%d", &n);

printf("m=%d,n=%d", m, n);

printf("两个数值进行交换\n");

i = m;

m = n;

n = i;

printf("m=%d,n=%d\n", m, n);

system("pasue");

return 0;

}

 

错误 1 error C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. d:\程序\交换两个整型变量的数值\交换两个整型变量的数值\.cpp 9 1 交换两个整型变量的数值

 

 

相信很多人在用vs编写程序的时候都会遇到我发的这种问题,我在学习C语言的时候老师明确的告诉我说取值的语句就是scanf语句,为什么我现在写出来它报错了,这么简单的语句我肯定不会写错,那到底是哪出了问题呢?它为什么会提示我让我写scanf-s呢?

首先我先来说一下scanfscanf-s的区别

scanf()函数是标准C中提供的标准输入函数,用以用户输入数据

scanf_s()函数是Microsoft公司VS开发工具提供的一个功能相同的安全标准输入函数,从vc++2005开始,VS系统提供了scanf_s()。在调用该函数时,必须提供一个数字以表明最多读取多少位字符。

scanf()在读取数据时不检查边界,所以可能会造成内存访问越界:

1

2

3

4

//例如:分配了5字节的空间但是用户输入了10字节,就会导致scanf()读到10个字节

char buf[5]={'\0'};

scanf("%s", buf);

//如果输入1234567890,则5以后的部分会被写到别的变量所在的空间上去,从而可能会导致程序运行异常。

以上代码如果用scanf_s()则可避免此问题:

1

2

3

char buf[5]={'\0'};

scanf_s("%s",buf,5); //最多读取4个字符,因为buf[4]要放'\0' 

//如果输入1234567890,则buf只会接受前4个字符

 

所以来说这不是自己写代码的问题,而是vs这个编译器出了问题,于是有人就说好吧,那以后我就记住了不会再写scanf了全都写成scanf-s这样不就行了吗,首先,我感觉这真的是增加了一个小白的工作量,在编写代码的时候不仅时时记着改成scanf-s而且在调用这个函数的时候又多了一个变量,在调用的时候还需要给这个变量一个值。并且还有一个更加严重的问题虽然现在还影响不到你但是终究会有影响,那就是,这个scanf-s是微软公司出的vs所提供的,别的编译软件并没有这个东西,所以当你将所有的scanf全都改了之后,在其他平台就会出现新的错误,在你工作的时候,大家肯定有人会用其他的编译器,所以在一直平台的时候就会大大降低代码的通用性。

  那我今天就给大家说两个我自己所知道的办法:

 第一个:

 

 

点开vs上边的项目,然后看最下边有一个你的项目的属性

 

点属性你就会出来这个项目的属性页

 

进去找配置属性----C/C++-----代码生成,找到其中一个安全检查的选项,你发现后边的选项中是启用安全检查,这时候你点一下后边

 

将后边的安全检查改成禁用这时候你再去运行的你代码。

 

这时候虽然下边会有警告,但是完全不影响你代码的运行了已经。

第一个的方法,虽然每个程序只用更改一次,但是当你关了这个项目再开另一个项目的时候你会发现,它的安全检查又开了,所以你需要再更改一次,第二种方法我给大家介绍一个一次性操作的方法。

第二种方法:

   这时候你看你最初的时候提出的错误

1 error C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. d:\程序\交换两个整型变量的数值\交换两个整型变量的数值\.cpp 9 1 交换两个整型变量的数值

_CRT_SECURE_NO_WARNINGS 你会发现有一个这个东西。那咱们就用这个东西来改变现在的问题。

 

找到你的VS安装目录

 

 


VC-vcprojectitems-newc++file

然后把他用Notepad++打开,如果用其他的应用打开的话,例如vs、记事本等等打开之后是不能将他更改的,用notepad++打开之后 #define _CRT_SECURE_NO_WARNINGS 1在文档中加入一句这个话,然后保存,有的电脑会要求你使用管理者权限,这时候你通过就可以。

 

再之后你创建的所有项目开始就会有这一句话,你在这句话下边再正常编写你的代码就可以了。之后就不会再出现错误了。

  这是我所知道的两种解决VS提示安全问题的方法,仅供参考。