全部博文(11)
分类: C/C++
2013-05-18 14:15:31
strcpy函数的原型是
char *strcpy(char *strDest, const char *strScr)
{
char *address=strDest;
assert((strDest != NULL) && (strScr != NULL)); //是判断传进来的指针是否为空 如果为空返回一个错误值
while(*strScr) //是while(*strScr != ’\0’)的简化形式;
{
*strDest++ = *strScr++;
}
*strDest = '\0'; //当strScr字符串长度小于原strDest字符串长度
return address; //时,如果没有改语句,就会出错了。
}
可能在大多数人用strcpy函数时,都会有个约束,就是原字符串的长度要小于要拷贝目标字符串的长度,也就是*strScr小于
*strDest,我们在定义字符串时,就会赋予其长度。
例如:
char str_dest[20];
char str_scr[10];
strcpy(str_dest, str_scr);
这样就把str_scr字符串中的内容拷贝到str_dest字符串中了
可是有时候我们会不小心把*strScr的长度大于*strDest的长度了 这时会有什么效果呢
就比如:
char str_dest[10];
char str_scr[20];
strcpy(str_dest, str_scr);
我的验证是,程序并不好报错,它会继续输出str_scr中的内容;
举个简单的例子:
# include
# include
int main()
{
char str1[3];
char str2[20]={"this is a test"};
strcpy(str1, str2);
printf("%s\n", str1);
return 0;
}
运行结果: this is a test
这时我们会把目光注视到原函数上,我们发现strcpy的原函数并没有加两个字符串长度的限制条件,它只是把原字符串中的内容
一个一个地赋值到目标字符串中,而且到最后还给目标字符串加上了结束符“\0”。那么如果目标字符串长度不够时会怎么样呢
? 笔者认为 它会继续一个一个地赋值字符。 拿上面的例子 str1[3], str2[20]="this is a test", str2往str1里赋值。当
str2里的thi 到s 的时候,str1的长度不够了,但是数字中的地址是连续的,比如str1的首地址是1000,那么str1[0]
=1000,str1[1]=1001,str1[2]=1002, 这个时候还要继续往str1里赋值,怎么办,地址还会继续增加的,那么继续增加的地址是我
们没有申请的空间的,这样的话就会很危险的,如果没有申请的地址空间没有被系统占用还好,如果被系统占用的话系统可能就
会崩溃的,所以在使用strcpy函数时要小心谨慎, 原字符串长度要小于目标字符串的长度。