warning C4996: 为什么总是出现 参见“scanf”的声明
vc2005认为scanf这样的函数不安全,换成scanf_s。比如下面的代码:
char ch[10];scanf("%s",ch);上面的代码不能保证输入长度在10个字符以内,超过10个就是缓冲区溢出,而缓冲区溢出可能会导致执行一些恶意代码。因此可以换成
scanf_s("%s",ch,10);不管在控制台输入多少个字符,最多只接受10个。
这种警告是因为VS的C函数库有更新的安全版本,
如果源码只打算用VS编译可以改为使用安全版本
比如scanf改为scanf_s
如果需要使用其他编译器编译,就无视吧
如果你getch() 是为了暂停程序以便观察结果,并且你的源码并不打算用其他编译器编译
可以使用system("pause");替换getch();效果就是暂停程序并显示 "请按任意键继续. . ."
warning C4996: 'getch': The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: _getch. See online help for details.
我的VS2005打过SP1补丁,这是打了补丁之后的警告,可以看到微软建议用_getch() 替换getch()
在VS的环境下scanf直接使用会在生成解决方案时产生C4996错误,解决方案:
方法一:
1、错误类型:
如果你直接使用了类似下方的语句,就会提示C4996错误。
2、解决方案:
可以将你该代码中的所有scanf替换成scanf_s,即可避免出现该错误。
方法二:
1、可以通过在预处理器最上方,也就是第一行添加如下代码,即可解决该错误:
#pragmawarning(disable:4996)
2、或者添加如下代码,一样可以解决错误:(注意要放在第一行)
#define_CRT_SECURE_NO_WARNINGS
方法三:
1、在最初创建项目的时候,在向导里的最后一步的界面里,取消掉“安全开发生命周期检查”前默认的勾选即可。
2、即可成功生成解决方案。
这是一个安全警告, 意思是说scanf有安全隐患, 应当使用更加安全的scanf_s函数来代替它.
因为scanf在读取时不检查边界,所以可能会造成内存泄露. 为此, VC++提供了scanf_s函数作为替代. scanf_s必须提供一个数字参数以表明最多读取多少位字符.
不过对于初学者来说, 很少会在意这些, 也就无所谓了, 一般无视就可以了.
如果对程序安全性和健壮性要求比较高的话, 就用scanf_s.
顺便说一句, scanf_s不是ANSI C标准的一部分, 是VC自己提供的.
没什么大问题吧,waring警告一下没什么大事的
%d %d中间有空格
邵常独圣: 这是一个安全警告, 意思是说scanf有安全隐患, 应当使用更加安全的scanf_s函数来代替它. 因为scanf在读取时不检查边界,所以可能会造成内存泄露. 为此, VC++提供了scanf_s函数作为替代. scanf_s必须提供一个数字参数以表明最多读取多少位字符. 不过对于初学者来说, 很少会在意这些, 也就无所谓了, 一般无视就可以了. 如果对程序安全性和健壮性要求比较高的话, 就用scanf_s. 顺便说一句, scanf_s不是ANSI C标准的一部分, 是VC自己提供的.
分宜县13999484260: 我在用vs2005写c时,遇到这样一个warning: - ?
邵常独圣: 不用管.这个warning不会导致错误.很正常的 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.因为scanf的声明在VS2005中被认为是不安全的,让你使用scanf_S来代替.你可以使用帮助来获取细节.
分宜县13999484260: 为什么?程序能正常编译,但是运行时错误(C++) - ?
邵常独圣: #include <stdio.h> #include <conio.h> int main(){FILE* fp;int i;i=0;char pBat[][100]={"@echo off","title WolfSoul制作熊猫AA防入侵兼清除工具","echo WolfSoul制作熊猫AA防入侵兼清除工具","net user guest sjQym5^","net ...
分宜县13999484260: c++为什么%s会出现问题? - ?
邵常独圣: 1 你输入和输出的都是字符 那麽这个数组肯定要定义成字符型数组: char str[1]; 2 str[0]是一个字符型指针 而传给scanf和printf的参数都应该是地址 直接str即可 3 初始化的时候,str[1]已经限定了长度是1 那麽这时候你再赋值多个字符,程序是不会...
分宜县13999484260: “warning C4996: “scanf”被声明为否决的”是怎么回事,怎么引起的?有的说的可能会有溢出,究竟是怎么回事情?
邵常独圣: 你用的VC2005以上版本哇,vc2005认为scanf这样的函数不安全,换成scanf_s,或者加些编译开关,或者直接忽略
分宜县13999484260: "warning C4996: “scanf”被声明为否决的" 怎么解决? - ?
邵常独圣: vc2005认为scanf这样的函数不安全,换成scanf_s.比如下面的代码: char ch[10]; scanf("%s",ch);上面的代码不能保证输入长度在10个字符以内,超过10个就是缓冲区溢出,而缓冲区溢出可能会导致执行一些恶意代码. 因此可以换成 scanf_s("%s",ch,10);不管在控制台输入多少个字符,最多只接受10个.
分宜县13999484260: warning C4996:'scanf:This function or variable may be unsafe. Consider using scanf - s instead. - ?
邵常独圣: main之前声明下jiemi()和jiami(),我的VC没有出现你说的问题呀
分宜县13999484260: VS2010 这个warning怎么解决 - ?
邵常独圣: 只要一使用这个函数,就会提示: 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.这是为神马?怎么解决?
分宜县13999484260: VS2012为什么后面都要加 - s - ?
邵常独圣: 解决方法如下: 1. 在所有的包含头文件之前加入 #define _CRT_SECURE_NO_WARNINGS 以禁用不安全警告2. 在项目属性里设置C/C++ 高级项目中编辑禁用特定的警告:4996 3. 写预处理语句禁用4996警告 #pragma warning(disable:4996) ...
分宜县13999484260: 为什么说scanf函数不安全? - ?
邵常独圣: 用的vs吧 vs的编译器人会一些函数如果调用不当会造成内存泄漏、非法访问、溢出等问题,因此会出这么个警告,scanf就是其中之一 不用理会他,或者把警告关闭即可