新壶装老酒之如何拯救哀怨的scanf老兵
2015-11-02 14:19
169 查看
上一篇中,我说到自己写好的代码无法运行,具体原因就是因为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,还是让她留在垂暮之年里回忆自己曾经的辉煌吧
下图是具体的错误提示截图:
在解决这种问题之前,我们首先来谈谈什么是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,还是让她留在垂暮之年里回忆自己曾经的辉煌吧
相关文章推荐
- 在输入输出字符串时scanf(),printf()和gets(),puts()的区别浅谈
- 浅析C语言中printf(),sprintf(),scanf(),sscanf()的用法和区别
- 使用scanf询问用户是否继续
- Win8.1下FreeImage.lib库的配置和简单使用
- 由scanf说起之1:scanf函数和回车、空格 及其返回值
- VS2013中 命名空间“UnityEngine”中不存在类型或命名空间名称“UI”。是否缺少程序集引用?
- [Qt]Qt5.3.0+VS2013+Win32平台搭建
- [VS2013+Win7]GLEW库配置问题 error LNK2019: 无法解析的外部符号 _gluGetString@4
- OpenCV2.4.10+VS2013+Win8.1 64位配置
- vs2013下openSIFT的编译调试
- 神经网络 caffe 的 vs2013 版本代码
- Windows8下PhoneGap 4 + Android Studio 1.0 + VS2013配置指南
- scanf&getchar&gets及一些特殊用法
- opencv2的安装、在VS上的配置以及第一个示例
- C语言基础-数据类型提升的层次结构
- APUE课后习题10.6练习代码
- 黑马程序员——C语言基础知识整理——printf函数与scanf函数
- vs2013中使用PB DataWindow .net
- 错误 1 error C2040: “menu”:“auto”与“cocos2d::Menu *”的间接寻址级别不同
- error C2664: “void std::_Pmf_wrap<void (__thiscall cocos2d::Layer::* )(const std::vector<cocos2d::To