目录
函数介绍:
是将一个字符串复制到另一块空间地址中 的函数,‘\0’是停止拷贝的终止条件,同时也会将 '\0' 也复制到目标空间(不论\0在字符串中的那个位置,遇到了都会停下且被拷贝)。
函数声明:
char* strcpy(char* destination,const char* source);
1. 函数的参数:
char* destination---------目标字符串的首地址
const char* source------源地址:被复制的字符串的首地址,用const修饰,避免修改掉被拷贝的字符串。
2.函数的返回值类型:
char*:返回的是目标字符串的首地址。
功能:
功能是将源字符串的内容拷贝到目标空间期望目标空间的内容发生变化所以返回目标空间的起始的地址,方便观察目标空间的数据。
具体使用:
情况一:
int main()
{
char arr[10] = "########";
printf("%s\n", strcpy(arr, "hello"));
return 0;
}
输出结果:
情况二:
int main()
{
char arr1[10] = "**********";
char arr2[10] = "HELLO";
printf("%s\n", strcpy(arr1, arr2));
return 0;
}
输出结果:
注意事项:
1.源字符必须以 '\0'结束:没有'\0'的字符串
int main()
{
char arr1[10] = "**********";
char arr2[] = { 'b','i','t' };
printf("%s\n", strcpy(arr1,arr2));
return 0;
}
代码会出错,因为\0是终止strcpy访问的条件,若没有\0,strcpy会继续遍历,直到在内存中碰见\0为止,这一点和strlen很像,而在找到\0之前,strcpy会拷贝一些乱七八糟的代码。
2.目标空间必须足够大,以确保能放源字符串:数组的越界访问
int main()
{
char arr1[3] = "";
char arr2[] = "hello world";
printf("%s\n", strcpy(arr1,arr2));
return 0;
}
目标空间不满足拷贝的内容,虽然会拷贝成功,但是程序会崩溃且造成越界访问。
3.目标空间必须可变:常量字符串不可更改
int main()
{
char* p = "abcdefg";
char str[10] = "hijk";
printf("%s\n", strcpy(p,str));
return 0;
}
p是字符类型的指针,存放的是常量字符串,不可改变,所以p是不可改变的空间,而目标空间必须是可以被修改的,因为要将拷贝的字符串放在目标空间中。
4.遇见'\0'便会停下:提前遇见'\0'
int main()
{
char num[20] ;
strcpy(num,"zhang\0san");
printf("%s\n", num);
return 0;
}
之前说过\0是strcpy的终止符,所以在拷贝的过程中要确保\0处在拷贝内容的最尾端,同时\0也会被拷贝到目标空间
strcpy的模拟实现:
char *my_strcpy(char *dest, const char*src) //dest是目标空间,src是拷贝内容
{
char *ret = dest;//将目标空间最开始的地址交予一个新的指针
assert(dest != NULL);
assert(src != NULL);
while((*dest++ = *src++)) //将对应位置的拷贝内容传输到目标空间的对应位置,直到输入\0为止
{
;
}
return ret;//返回目标空间起始地址,为了方便返回和打印拷贝完后的字符串
}
- while((*dest++ = *src++))
- *dest++ = *src++可以理解为*dest = *src ; dest++;src++; 先进行赋值后进行++移动地址。
- 而循环的结束是当src移动到了\0的位置。
- 所以 while((*dest++ = *src++)) { };可以演化为while(*src != '\0'){*dest = *src ; dest++;src++; };*dest = *src; (最后一部是拷贝\0)
结论:模拟实现的本质其实是目标空间和原空间在不断的移动,在移动的同时将原空间的字符赋值给目标空间,当原空间的\0赋值完毕后,立刻返回到目标空间的起始地址,也可以说是被赋值后的字符串首个字符地址。