[拓展]scanf与scanf_s的区别

        从版本看:非_s版本的函数是旧版本的c语言函数,_s 版本的函数是C11标准的新函数

        scanf在高版本vs报错解决方法:

        1、声明宏:#define_CRT_SECURE_NO_WARNINGS

        2、scanf_s

        3、关掉sdl:属性->c/c++->常规->sdl检查

      scanf_s 比 scanf 安全? 主要体现在越界问题中的处理措施。

        先给大家演示下scanf

正常情况下来说,5个元素的字符数组最多只能输入4个字符,因为第五个字符是给\0(就是字符串的结束标志)留位置,所以最多就只能输入4个,这也是很多人经常犯的错误,总是把\0遗忘导致越界的情况

把断点(就是图片中那个红色的大点点)放到函数结束的位置,点本地windows调试器进入调试状态,接下来输入一串更加长的字符串

会发现是正常输出的

但当我们像这样点"继续"(就是执行到程序结束了)的时候......

会发现这个时候才引发异常,scanf越界不是立即表现的,而是在我们程序结束以后才表现,如果程序不结束,这个问题就表现不出来

接下来给大家演示下scanf_s,注意,这里scanf_s要多加一个参数,也就是字符数组的字节数

然后和上面的scanf测试一样的操作 

会发现控制台上直接不输出了,把鼠标停在a这个位置会发现装的是一个空字符串,也就是没有将字符串输入进去

说明scanf_s处理的现象就是"你越界了我就不给你去输入,如果你不越界,我就正常去给你输入" 。

科普一下:scanf这个函数的返回值是成功写入变量的个数,可以利用这一点来测试一下(调试状态下),接下来是正确输入的情况:

就像这样,然后把鼠标停在b上面会发现返回的是1,那就是成功输入了,因为只输入了一个字符串,所以scanf的返回值是1,如果不想在调试模式下看也可以直接printf输出b的值

然后接下来是不正确输入的情况:

会发现b的值是0,这个也好理解,就是没写入成功。

总结一下:

scanf 是在程序结束后报异常中断,不会立即中断

缺点1(实际操作影响):如果写了很多行代码,有很多个scanf输入,这个时候很难很快找到越界点。

缺点2:程序如果一直不结束,会越来越离谱,就像破窗效应

缺点3:越界操作可能会侵害其他变量的空间,引发的错误会比较莫名其妙

scanf_s 会执行失败,变量输入不成功,函数返回值为0

优点1:有那个可能及时知道错误点,处理起来也会快一些

优点2,不会出现越界问题,所以不会侵害其他变量空间

好了,今天的分享就到这里了❤,是不是觉得奇怪的知识又增加了呢~

  • 8
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值