您当前的位置:首页 > 计算机 > 编程开发 > C语言

使用C语言中字符串的处理函数提示错误C4996:'strcpy': This function or variable may be unsafe. Consider using

时间:01-14来源:作者:点击数:

使用C语言中字符串的处理函数提示错误

*需包含头文件"string.h"

#include "string.h"

以strcpy函数为例

原型:strcpy(str1, str2);

功能:将字符串str2赋值到字符串str1中。可以用来为字符串赋值

注意:1)会把str1原始字符串全部覆盖;2)str2的长度不能超过str1定义的长度

char str1[]="We are csdn!";
char str2[]="Hello!";

strcpy(str1,str2);
printf("str1 = %s\n",str1);
//结果:str1 = Hello!

在VS2017中,如果直接这样写会提示如下错误:

原因解释:

这种微软的警告,主要因为那些C库的函数,很多函数内部是不进行参数检测的(包括越界类的),微软担心使用这些会造成内存异常,所以就改写了同样功能的函数,改写了的函数进行了参数的检测,使用这些新的函数会更安全和便捷。关于这些改写的函数你不用专门去记忆,因为编译器对于每个函数在给出警告时,都会告诉你相应的安全函数,查看警告信息就可以获知,在使用时也再查看一下MSDN详细了解。

处理方法:

1)项目属性->C/C++->预处理器->预处理器定义中添加:_CRT_SECURE_NO_WARNINGS

2)使用提示的strcpy_s代替strcpy

现在我们来检验一下注意当中的第二条:str2的长度不能超过str1定义的长度

我们改变一下代码,让str2的长度大于str1的长度,同时采用处理方法中的第一条,还是使用strcpy函数:

char str1[] = "We are csdn!";
char str2[] = "Hello we are csdn!";

strcpy(str1, str2);
printf("str1 = %s\n", str1);
//结果:str1 = Hello we are csdn!

我们得到了正确结果:

现在我们不采用第一种处理方法,而采用第二种处理方式,使用strcpy_s函数代替strcpy函数:

char str1[] = "We are csdn!";
char str2[] = "Hello we are csdn!";

strcpy_s(str1, str2);
printf("str1 = %s\n", str1);
//结果:str1 = Hello we are csdn!

运行后提示如下错误:

这个错误就是字符组数组越界了,这是因为strcpy_s函数检测了str1的长度是否大于str2的长度,发现并不满足str1的长度大于str2的长度,所以提示错误,然而strcpy函数却没有这种检测,所以得出了正确结果,但这是极其危险的,因为这种方式修改了没有在定义中的内存,会恶意改写没有经过系统分配的内存。

所以不管使用哪种处理方式,我们都应该注意字符串的长度,避免这种潜在的危险性,推荐第二种处理方式,这样会有检测,避免危险性

strcpy函数检测

char str1[] = "We are csdn!";
char str2[] = "Hello We are csdn!";

int size1 = strlen(str1);  //size1=12
int size2 = sizeof(str1);  //size2=13

strcpy(str1, str2);

int size3 = strlen(str1);  //size3=18
int size4 = sizeof(str1);  //size4=13

从中也可以发现strlen函数与sizeof函数的区别,strlen函数计算字符串的长度,但不包括字符'\0',但sizeof函数计算整个这个字符串数组占内存的大小,包括字符'\0';在把字符串str2复制到str1中后,字符串的长度已经超过了字符串数组的长度了,这是危险的,但我们发现这时字符串的长度以改变,但字符串数组的大小并没有改变

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门