使用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中后,字符串的长度已经超过了字符串数组的长度了,这是危险的,但我们发现这时字符串的长度以改变,但字符串数组的大小并没有改变