从版本看:非_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,不会出现越界问题,所以不会侵害其他变量空间
好了,今天的分享就到这里了❤,是不是觉得奇怪的知识又增加了呢~