您的位置:首页 > 其它

VS2013中scanf,print不安全

2016-11-01 09:35 155 查看
出现这种情况的原因是我们使用了不安全的CRT函数,旧式的scanf在读取数据的时候会根据format指示从缓冲区中读取直至结束,但有些时候我们的format指示会有Bug,导致scanf读取了给定的缓冲区以外(数组越界)的数据。

看下例:

scanf(“%d”, &a);

假设我们输入数字1234,然后按回车。正常情况下,缓冲区中有一个数组1234、一个换行符(通常是”\r\n”),这时读取正确。但“有些时候”,缓冲区中的数据并不一定正确,这时候我们需要给定缓冲区的起始位置和缓冲区的长度来限制scanf的读取范围。但设计CRT函数的人在设计scanf的时候没有考虑到这么多的不安全因素,所以有了安全版本的scanf,级scanf_s,s的意思就是safe,我们会看到很多_s版本的函数,sprintf_s,vsnprintf_s等等,它们的作用都是一样的。总之,带_s的函数是不带_s的安全版本。我们习惯使用了不带s的版本,有时vs就会报各种错。下面有两种解决方法。

新建项目的时候,在最后一步的一个界面,把安全开发生命周期(SDL)检查(C)前面的对号勾掉。

Properties->configuration properties->C/C++ ->general->SDL checks() 选择no

如果新建的时候忘记勾了,可以右击项目列表, Properties->configuration properties->C/C++ ->Preprocessor->Preprocessor Definitions 编辑,加上 _CRT_SECURE_NO_WARNINGS。

以上解决了scanf_s报错的问题,但个人建议使用这类函数都加上_s,养成个人习惯了就好了,毕竟加上后缀是一个安全的函数,以免出现不可预知的问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: