warning C4996: 为什么总是出现 参见“scanf”的声明

本文探讨了C/C++编程中使用scanf存在的安全隐患,并介绍了更安全的替代函数scanf_s。解释了scanf可能导致的内存泄露问题,以及如何通过scanf_s函数避免这些问题。对于追求程序安全性和健壮性的开发者,此文章提供了实用的建议。

warning C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. 处理办法

 

这是一个安全警告, 意思是说scanf有安全隐患, 应当使用更加安全的scanf_s函数来代替它. 因为scanf在读取时不检查边界,所以可能会造成内存泄露. 为此, VC++提供了scanf_s函数作为替代. scanf_s必须提供一个数字参数以表明最多读取多少位字符. 不过对于初学者来说, 很少会在意这些, 也就无所谓了, 一般无视就可以了.如果对程序安全性和健壮性要求比较高的话, 就用scanf_s. 顺便说一句, scanf_s不是ANSI C标准的一部分, 是VC自己提供。

微软认为scanf的使用存在安全隐患,因为C/C++中的字符串处理都是以\0为截止符的,如果搜索不到\0,容易出现字符串越界所有vc扩展的所谓安全标准库,都添加了一个参数用以指定字符串参数的长度,用以避免这种安全隐患。

 

1>------ 已启动生成: 项目: test, 配置: Release Win32 ------ 1>test.cpp 1>c:\test\test\include\libavutil\rational.h : warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失 1>c:\test\test\test.cpp(100): warning C4018: “<”: 有符号/无符号不匹配 1>c:\test\test\test.cpp(121): error C3861: “fix_extradata”: 找不到标识符 1>c:\test\test\test.cpp(175): error C4996: 'AVStream::codec':声明为已否决 1>c:\test\test\include\libavformat\avformat.h(885): note: 参见“AVStream::codec”的声明 1>c:\test\test\test.cpp(79): error C4996: 'av_register_all':声明为已否决 1>c:\test\test\include\libavformat\avformat.h(2050): note: 参见“av_register_all”的声明 1>c:\test\test\test.cpp(161): error C4996: 'av_bitstream_filter_init':声明为已否决 1>c:\test\test\include\libavcodec\avcodec.h(5861): note: 参见“av_bitstream_filter_init”的声明 1>c:\test\test\test.cpp(175): error C4996: 'av_bitstream_filter_filter':声明为已否决 1>c:\test\test\include\libavcodec\avcodec.h(5868): note: 参见“av_bitstream_filter_filter”的声明 1>c:\test\test\test.cpp(245): error C4996: 'av_bitstream_filter_close':声明为已否决 1>c:\test\test\include\libavcodec\avcodec.h(5878): note: 参见“av_bitstream_filter_close”的声明 1>已完成生成项目“test.vcxproj”的操作 - 失败。 ========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========
最新发布
12-04
1>------ 已启动生成: 项目: 3, 配置: Debug Win32 ------ 1> 3.c 1>c:\users\administrator\documents\visual studio 2010\projects\3\3\3.c(9): warning 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. 1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\stdio.h(304) : 参见scanf”的声明 1>c:\users\administrator\documents\visual studio 2010\projects\3\3\3.c(12): warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\stdio.h(234) : 参见“fopen”的声明 1>c:\users\administrator\documents\visual studio 2010\projects\3\3\3.c(19): error C2143: 语法错误 : 缺少“;”(在“类型”的前面) 1>c:\users\administrator\documents\visual studio 2010\projects\3\3\3.c(20): error C2065: “i”:声明的标识符 1>c:\users\administrator\documents\visual studio 2010\projects\3\3\3.c(21): error C2065: “i”:声明的标识符 1>c:\users\administrator\documents\visual studio 2010\projects\3\3\3.c(21): error C2065: “i”:声明的标识符 1>c:\users\administrator\documents\visual studio 2010\projects\3\3\3.c(21): error C2065: “i”:声明的标识符 1>c:\users\administrator\documents\visual studio 2010\projects\3\3\3.c(22): error C2065: “j”:声明的标识符 1>c:\users\administrator\documents\visual studio 2010\projects\3\3\3.c(22): error C2065: “i”:声明的标识符 1>c:\users\administrator\documents\visual studio 2010\projects\3\3\3.c(24): error C2065: “i”:声明的标识符 1>c:\users\administrator\documents\visual studio 2010\projects\3\3\3.c(28): error C2065: “j”:声明的标识符 ========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========
03-11
1>------ 已启动生成: 项目: zjy951, 配置: Debug x64 ------ 1>Dialog.c 1>D:\新建文件夹\zjy951\zjy951\Dialog.c(120,21): warning C4473:scanf_s”: 没有为格式字符串传递足够的参数 1> D:\新建文件夹\zjy951\zjy951\Dialog.c(120,21): 1> 占位符和其参数预计 2 可变参数,但提供的却是 1 参数 1> D:\新建文件夹\zjy951\zjy951\Dialog.c(120,21): 1> 缺失的可变参数 2 为格式字符串“%s”所需 1> D:\新建文件夹\zjy951\zjy951\Dialog.c(120,21): 1> 此参数用作缓冲区大小 1>D:\新建文件夹\zjy951\zjy951\Dialog.c(122,17): error C2371: “new_car”: 重定义;不同的基类型 1> D:\新建文件夹\zjy951\zjy951\Dialog.c(121,17): 1> 参见“new_car”的声明 1>D:\新建文件夹\zjy951\zjy951\Dialog.c(126,24): warning C4477: “printf”: 格式字符串“%s”需要类型“char *”的参数,但可变参数 1 拥有了类型“int” 1>D:\新建文件夹\zjy951\zjy951\Dialog.c(126,24): warning C4313: "printf": 格式字符串中的 "%s" 与类型为 "int" 的参数 1 冲突 1>D:\新建文件夹\zjy951\zjy951\Dialog.c(131,24): warning C4477: “printf”: 格式字符串“%s”需要类型“char *”的参数,但可变参数 1 拥有了类型“int” 1>D:\新建文件夹\zjy951\zjy951\Dialog.c(131,24): warning C4313: "printf": 格式字符串中的 "%s" 与类型为 "int" 的参数 1 冲突 1>D:\新建文件夹\zjy951\zjy951\Dialog.c(142,21): warning C4473:scanf_s”: 没有为格式字符串传递足够的参数 1> D:\新建文件夹\zjy951\zjy951\Dialog.c(142,21): 1> 占位符和其参数预计 2 可变参数,但提供的却是 1 参数 1> D:\新建文件夹\zjy951\zjy951\Dialog.c(142,21): 1> 缺失的可变参数 2 为格式字符串“%s”所需 1> D:\新建文件夹\zjy951\zjy951\Dialog.c(142,21): 1> 此参数用作缓冲区大小 1>D:\新建文件夹\zjy951\zjy951\Dialog.c(127,36): error C4996: 'ctime': This function or variable may be unsafe. Consider using ctime_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 1>D:\新建文件夹\zjy951\zjy951\Dialog.c(162,40): error C4996: 'ctime': This function or variable may be unsafe. Consider using ctime_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 1>D:\新建文件夹\zjy951\zjy951\Dialog.c(163,40): error C4996: 'ctime': This function or variable may be unsafe. Consider using ctime_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 1>已完成生成项目“zjy951.vcxproj”的操作 - 失败。 ========== 生成: 0 成功,1 失败,0 最新,0 已跳过 ========== ========== 生成 于 8:34 完成,耗时 02.094 秒 ==========怎么改
06-18
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值