C语言常见错误杂谈(一)scanf()、scanf_s()与错误 C4996与解决方法
2016-04-27 11:43
489 查看
错误 C4996
初学C语言时,第一个接触到的I/O函数便是scanf()了。但在高版本的 Visual Studio (包括但不限于2015、2013、2012)编译代码时,却会出现意想不到的错误。
有如下一段简单的代码:
但会输出一个错误 C4996,错误信息如下
错误 1 error C4996: ‘scanf’: This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
报错说scanf不安全,推荐将scanf替换scanf_s。替换之后之后,代码如下
便没有错误提示了。
scanf与scanf_s
在MSDN有介绍这些以_s结尾的函数,包括 scanf_s、scanf_s_l、wscanf_s、_wscanf_s_l。这些版本的函数具有安全增强功能。
scanf等函数存在于版本较旧的CRT(C runtime library, part of the C standard library)中,具有安全性问题,比如在读取字符时,若不指定%s的宽度,可能会导致缓冲区溢出。
在使用scanf时,如果规定了读取的宽度,便不会报错。将代码修改如下:
这里控制了读入的%d宽度为5。但是读入的数据超过宽度的限制时,便会丢失数据。比如这是输入100000,输出的i值为10000。
解决方法
1.使用scanf时规定宽度。
2.使用sacnf_s替换sacnf。
3.在新建项目的时候取消SDL检查。
本文由 whchina(江城老温)原创发布,转载请注明出处,江城老温 as a thinker。
初学C语言时,第一个接触到的I/O函数便是scanf()了。但在高版本的 Visual Studio (包括但不限于2015、2013、2012)编译代码时,却会出现意想不到的错误。
有如下一段简单的代码:
#include "stdio.h" int main(void) { int i; printf("Input i\n"); scanf("%d", &i); printf("i is %d", i); return 0; }
但会输出一个错误 C4996,错误信息如下
错误 1 error C4996: ‘scanf’: This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
报错说scanf不安全,推荐将scanf替换scanf_s。替换之后之后,代码如下
#include "stdio.h" int main(void) { int i; printf("Input i\n"); scanf_s("%d", &i); printf("i is %d", i); return 0; }
便没有错误提示了。
scanf与scanf_s
在MSDN有介绍这些以_s结尾的函数,包括 scanf_s、scanf_s_l、wscanf_s、_wscanf_s_l。这些版本的函数具有安全增强功能。
scanf等函数存在于版本较旧的CRT(C runtime library, part of the C standard library)中,具有安全性问题,比如在读取字符时,若不指定%s的宽度,可能会导致缓冲区溢出。
在使用scanf时,如果规定了读取的宽度,便不会报错。将代码修改如下:
#include "stdio.h" int main(void) { int i; printf("Input i\n"); scanf_s("%5d", &i); printf("i is %d", i); return 0; }
这里控制了读入的%d宽度为5。但是读入的数据超过宽度的限制时,便会丢失数据。比如这是输入100000,输出的i值为10000。
解决方法
1.使用scanf时规定宽度。
2.使用sacnf_s替换sacnf。
3.在新建项目的时候取消SDL检查。
本文由 whchina(江城老温)原创发布,转载请注明出处,江城老温 as a thinker。
相关文章推荐
- c++ 覆盖、重载与隐藏 浅析
- 两种方法求两个数的最大公约数和最小公倍数--C语言
- 删除vector中重复元素
- c++内存分配方式
- 构建链表 c++
- js调用vc++的函数
- [C++]C++标准里 string和wstring
- C++实现二叉树的存储与遍历
- c&c++框架
- 对于C语言free()函数的一些反思
- Mac os 上用C++进行MYSQL开发配置
- C语言算法---求鞍点
- C++ STL中的map用红黑树实现,搜索效率是O(lgN),为什么不像python一样用散列表从而获得常数级搜索效率呢?
- C语言算法---求鞍点
- C语言算法---求鞍点
- C++基础之动态分配内存
- c++: stringstream的使用
- 如何判断一个txt文件的编码格式
- c++使用rapidxml
- C++中多重继承的二义性及解决办法