解决c语言中调用scanf()或者strcpy()函数报错问题

简介: 解决c语言中调用scanf()或者strcpy()函数报错问题

引言



最近在使用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


20161124184308877.png

错误原因


这是因为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

20161124190650818.png


20161124190801327.png


上面问题可以永久解决问题。


小结


当我们遇到问题的时候,找到一种最好的的解决问题是明智的选择,希望能帮助广大读者。

目录
相关文章
|
18天前
|
存储 缓存 C语言
【c语言】简单的算术操作符、输入输出函数
本文介绍了C语言中的算术操作符、赋值操作符、单目操作符以及输入输出函数 `printf` 和 `scanf` 的基本用法。算术操作符包括加、减、乘、除和求余,其中除法和求余运算有特殊规则。赋值操作符用于给变量赋值,并支持复合赋值。单目操作符包括自增自减、正负号和强制类型转换。输入输出函数 `printf` 和 `scanf` 用于格式化输入和输出,支持多种占位符和格式控制。通过示例代码详细解释了这些操作符和函数的使用方法。
32 10
|
11天前
|
存储 算法 程序员
C语言:库函数
C语言的库函数是预定义的函数,用于执行常见的编程任务,如输入输出、字符串处理、数学运算等。使用库函数可以简化编程工作,提高开发效率。C标准库提供了丰富的函数,满足各种需求。
|
17天前
|
机器学习/深度学习 C语言
【c语言】一篇文章搞懂函数递归
本文详细介绍了函数递归的概念、思想及其限制条件,并通过求阶乘、打印整数每一位和求斐波那契数等实例,展示了递归的应用。递归的核心在于将大问题分解为小问题,但需注意递归可能导致效率低下和栈溢出的问题。文章最后总结了递归的优缺点,提醒读者在实际编程中合理使用递归。
42 7
|
17天前
|
存储 编译器 程序员
【c语言】函数
本文介绍了C语言中函数的基本概念,包括库函数和自定义函数的定义、使用及示例。库函数如`printf`和`scanf`,通过包含相应的头文件即可使用。自定义函数需指定返回类型、函数名、形式参数等。文中还探讨了函数的调用、形参与实参的区别、return语句的用法、函数嵌套调用、链式访问以及static关键字对变量和函数的影响,强调了static如何改变变量的生命周期和作用域,以及函数的可见性。
25 4
|
14天前
|
存储 C语言
【c语言】字符串函数和内存函数
本文介绍了C语言中常用的字符串函数和内存函数,包括`strlen`、`strcpy`、`strcat`、`strcmp`、`strstr`、`strncpy`、`strncat`、`strncmp`、`strtok`、`memcpy`、`memmove`和`memset`等函数的使用方法及模拟实现。文章详细讲解了每个函数的功能、参数、返回值,并提供了具体的代码示例,帮助读者更好地理解和掌握这些函数的应用。
15 0
|
14天前
|
C语言
【c语言】qsort函数及泛型冒泡排序的模拟实现
本文介绍了C语言中的`qsort`函数及其背后的回调函数概念。`qsort`函数用于对任意类型的数据进行排序,其核心在于通过函数指针调用用户自定义的比较函数。文章还详细讲解了如何实现一个泛型冒泡排序,包括比较函数、交换函数和排序函数的编写,并展示了完整的代码示例。最后,通过实际运行验证了排序的正确性,展示了泛型编程的优势。
15 0
|
18天前
|
算法 C语言
factorial函数c语言
C语言中实现阶乘函数提供了直接循环和递归两种思路,各有优劣。循环实现更适用于大规模数值,避免了栈溢出风险;而递归实现则在代码简洁度上占优,但需警惕深度递归带来的潜在问题。在实际开发中,根据具体需求与环境选择合适的实现方式至关重要。
17 0
|
27天前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
31 3
|
C语言
面试点:字符串strcpy函数(C语言面试题分析之二)
面试点:字符串strcpy函数 C语言面试题分析之二 一.基本知识点 Strcpy(字符数组1,字符串2) 1.strcpy该函数是通过第二个参数的字符串的结束符来判断是否拷贝结束的; 2.
1064 0
|
22天前
|
存储 编译器 C语言
C语言函数的定义与函数的声明的区别
C语言中,函数的定义包含函数的实现,即具体执行的代码块;而函数的声明仅描述函数的名称、返回类型和参数列表,用于告知编译器函数的存在,但不包含实现细节。声明通常放在头文件中,定义则在源文件中。