解决c语言中调用scanf()或者strcpy()函数报错问题
2016-11-24 19:18
831 查看
引言
最近在使用VS实现C语言程序的时候经常会遇到一些错误,但是这些函数的确是可以正确使用的,可能在
vc++6.0上就可以正常运行,很多参考书的代码都是以vc++6.0为标准的代码,所以这样我们在实现demo的时候会花费
一下时间在没有必要的错误上面,下面就给大家介绍一些解决方案。
问题重现
error C4996: 'scanf': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT
错误原因
这是因为scanf这个函数是个不安全的函数,可能会造成缓冲区的益出;
官方解读原因
“function”: 也被声明为否决 的 “std::<函数名>”: 具有可能不安全的参数的函数调用 - 此调用依靠调用
方检查传递的值是否正确。若要禁用此警告,请使用 -D_SCL_SECURE_NO_WARNINGS。请参阅有关如何使用 Visual
C++“经过检查的迭代器”的文档
此警告/错误有许多可能的含义。
C4996 可能会发生,因为编译器遇到了标记有 deprecated 的函数。在未来版本中可能不再支持此函数。可以
用 warning 杂注关闭此警告。
为了支持新的、更安全的函数,否决了某些 CRT 和标准 C++ 库函数。有关要改用的函数的更多信息,请参见
错误消息中被否决的函数的文档。若要关闭 CRT 否决警告,请定义 _CRT_SECURE_NO_WARNINGS。有关不推荐使用的
函数的更多信息,请参见 CRT 中的安全功能和安全库:C++ 标准库。
如果你在 std 命名空间中使用 <hash_map> 和 <hash_set> 头文件的成员,你将会看到 C4996。有关更多信
息,请参见 stdext 命名空间。
如果出于安全原因使用了否决的 MFC 或 ATL 函数,也可能发生 C4996。若要取消这些警告,请参见 _AFX_SECURE_NO_WARNINGS 和_ATL_SECURE_NO_WARNINGS。
在使用封送处理库时也可能会发生 C4996。在这种情况下,C4996 是错误,而非警告。使用 marshal_as 在需
要 marshal_context 类的两种数据类型之间进行转换时,将发生此错误。如果封送处理库不支持转换,您也会收到
此错误。有关封送处理库的更多信息,请参见 C++ 中的封送处理概述。
解决方案
1、在新建项目的时候不要勾选安全开发生命周期检查
2、按照提示将strcpy换成strcpy_s
3、在文件开头加上 #define _CRT_SECURE_NO_WARNINGS
上面三种方法不是很好的解决方案,因为在有的代码中会引发新的错误
最好的解决方法
1、每次调用strcpy函数时在文件开头 加上#pragma warning(disable:4996)。此方法比较直接有效。
2、右击项目名称——选择属性——C/C++——选择预处理——点击编辑——添加_CRT_SECURE_NO_WARNINGS
上面问题可以永久解决问题。
小结
当我们遇到问题的时候,找到一种最好的的解决问题是明智的选择,希望能帮助广大读者。
最近在使用VS实现C语言程序的时候经常会遇到一些错误,但是这些函数的确是可以正确使用的,可能在
vc++6.0上就可以正常运行,很多参考书的代码都是以vc++6.0为标准的代码,所以这样我们在实现demo的时候会花费
一下时间在没有必要的错误上面,下面就给大家介绍一些解决方案。
问题重现
error C4996: 'scanf': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT
错误原因
这是因为scanf这个函数是个不安全的函数,可能会造成缓冲区的益出;
官方解读原因
“function”: 也被声明为否决 的 “std::<函数名>”: 具有可能不安全的参数的函数调用 - 此调用依靠调用
方检查传递的值是否正确。若要禁用此警告,请使用 -D_SCL_SECURE_NO_WARNINGS。请参阅有关如何使用 Visual
C++“经过检查的迭代器”的文档
此警告/错误有许多可能的含义。
C4996 可能会发生,因为编译器遇到了标记有 deprecated 的函数。在未来版本中可能不再支持此函数。可以
用 warning 杂注关闭此警告。
为了支持新的、更安全的函数,否决了某些 CRT 和标准 C++ 库函数。有关要改用的函数的更多信息,请参见
错误消息中被否决的函数的文档。若要关闭 CRT 否决警告,请定义 _CRT_SECURE_NO_WARNINGS。有关不推荐使用的
函数的更多信息,请参见 CRT 中的安全功能和安全库:C++ 标准库。
如果你在 std 命名空间中使用 <hash_map> 和 <hash_set> 头文件的成员,你将会看到 C4996。有关更多信
息,请参见 stdext 命名空间。
如果出于安全原因使用了否决的 MFC 或 ATL 函数,也可能发生 C4996。若要取消这些警告,请参见 _AFX_SECURE_NO_WARNINGS 和_ATL_SECURE_NO_WARNINGS。
在使用封送处理库时也可能会发生 C4996。在这种情况下,C4996 是错误,而非警告。使用 marshal_as 在需
要 marshal_context 类的两种数据类型之间进行转换时,将发生此错误。如果封送处理库不支持转换,您也会收到
此错误。有关封送处理库的更多信息,请参见 C++ 中的封送处理概述。
解决方案
1、在新建项目的时候不要勾选安全开发生命周期检查
2、按照提示将strcpy换成strcpy_s
3、在文件开头加上 #define _CRT_SECURE_NO_WARNINGS
上面三种方法不是很好的解决方案,因为在有的代码中会引发新的错误
最好的解决方法
1、每次调用strcpy函数时在文件开头 加上#pragma warning(disable:4996)。此方法比较直接有效。
2、右击项目名称——选择属性——C/C++——选择预处理——点击编辑——添加_CRT_SECURE_NO_WARNINGS
上面问题可以永久解决问题。
小结
当我们遇到问题的时候,找到一种最好的的解决问题是明智的选择,希望能帮助广大读者。
相关文章推荐
- 关于调用strcpy()函数时总是报错问题,5种方法解决!
- <C语言>用递归调用函数解决穷举n位二进制数问题
- 用C语言解决(hanoi)汉诺塔问题——函数的递归调用
- 怎么解决操作无效,原因是它导致对 SetCurrentCellAddressCore 函数的可重入调用问题
- JQuery ajax 如何设置同步调用(同时只能触发一个函数) 解决与层显示信息时候的冲突问题
- WindowsMobile(Winform)开发中的数据存储(解决在不同的Form中要调用对方的方法或者使用对方的数据问题)
- jsp页面中调用某个新写的或者修改的方法,虽然函数没任何问题,但是编译不通过
- 多线程error C3867: 函数调用缺少参数列表问题解决办法:
- c语言中scanf("%c",&c)吃掉回车或者空格字符的问题
- 用内嵌汇编来解决运行时参数不确定的函数的调用问题
- 解决函数调用函数无效的问题
- jQuery在异步请求数据返回后,调用$("selector").html(data.content);之后因为一些特殊字符或者',"不能显示内容的问题解决办法
- MATLAB调用OpenCV2.4库函数的全过程及问题解决
- 用内嵌汇编来解决运行时参数不确定的函数的调用问题
- 程序中和有js函数的网页交互,线程中调用 get_Script 就会错误的解决方法,由于COM的线程安全问题
- C语言中关于scanf()函数返回值问题
- Linux内核模块导出后无法调用问题解决(模块间函数调用通讯)
- Linux内核模块导出后无法调用问题解决(模块间函数调用通讯)
- 解决:对 PInvoke 函数的调用导致堆栈不对称问题
- 解决:对 PInvoke 函数的调用导致堆栈不对称问题