新壶装老酒之如何拯救哀怨的scanf老兵

来源:互联网 发布:编程C 最大公约数 编辑:程序博客网 时间:2024/04/27 23:39

      上一篇中,我说到自己写好的代码无法运行,具体原因就是因为scanf函数与visual studio 2013平台不兼容【我不清除最早的断层是从第几代开始,反正我的13是不能用的】。查了一下,微软官方给出的解释是老版scanf函数并不执行边界检查,往缓冲区里写入的数据如果过多,有可能会覆盖掉其它有用的内存。

      下图是具体的错误提示截图:


          在解决这种问题之前,我们首先来谈谈什么是scanf函数。scanf函数是C语言的一个格式化输入函数,在头文件stdio.h中被定义。是一个int类型的函数,把成功匹配的输入项作为返回值。其声明方式为【int scanf( char *format, ...)】,我们可以使用vs2013的goto definition选项来查看有关scanf具体信息。下面是scanf函数中几个常用的格式转换说明:

1)%d:十进制整数;

2)%u:无符号十进制整数;

3)%o:八进制整数,以0开头;

4)%x:十六进制整数,以0X开头;

5)%c:字符类型,将输入中的多个字符挨个存放到指定位置中;

6)%s:字符串类型,把整个输入存放在一个指定数组中【注意,它不用加地址引用&操作符】,字符串的末尾会自动补上'\0'字符;

7)%f:浮点数类型,可以包含正负号、小数点和指数部分;

OK,现在我们已经熟悉了scanf的功能和用法,那么应该怎么在vs2013这种高大上的环境中使用呢?本人虽不才,但至少可以提供两种解决方案。

第一种:左键单机您的项目选项卡,接着单机您的工程属性选项卡,在里面找到【C/C++】选项,把其中的【是否执行SDL检查】设置为否。如图所示:

第二种:在程序代码的开头处加上【#pragma warning(disable 4996)】即可,如图所示:


在这里必须要说一下第三种方案,这个也是微软官方给出的建议方案,那就是使用scanf_s来代替scanf,它的使用方法与scanf函数完全一致,唯一的不同是多了一个边界检查的功能,至于老版输入函数scanf,还是让她留在垂暮之年里回忆自己曾经的辉煌吧

3 0
原创粉丝点击