VS中Scanf函数的安全性

 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 交换两个整型变量的数值
这种错误如何解决呢?为什么改成scanf-s就可以了呢?
下面我们来说一下scanf和scanf-s的区别


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


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


scanf()在读取数据时不检查边界,所以可能会造成内存访问越界:
//例如:分配了5字节的空间但是用户输入了10字节,就会导致scanf()读到10个字节


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


scanf("%s", a);


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


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


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


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


//如果输入123456789,则a只会接受前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提示安全问题的方法,仅供参考。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值