strcpy函数-----拷贝字符串到目标空间
//strcpy函数
//
//char* strcpy(char* destination, const char* source);
//
//拷贝一个字符串到另外一个空间
//
//注意点
//源字符串必须以\0结束
//会将源字符串中的\0拷贝到目标空间
//目标空间必须足够大,以确保能存放源字符串
//目标空间必须可变
//
//
int main()
{
char arr1[20] = { 0 };
char arr2[] = "abc def";
strcpy(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
注意点中的最后一点:目标空间必须可变,要求目标空间里不能是常量字符串
例如: char* arr1 = "abcdefg";
arr1指向常量字符串,常量是不可被修改的
---------------------------------------------------------------
模拟实现strcpy函数
void my_strcpy(char* dest, const char* src)
{
while (*src != '\0')
{
*dest = *src;
dest++;
src++;
}
*dest = *src;
}
int main()
{
char arr1[20] = { 0 };
char arr2[] = "wdjznb";
my_strcpy(arr1, arr2);
printf("%s\n", arr1);
//printf("%s\n",my_strcpy(arr1, arr2));//优化版本
return 0;
}
简单解释一下思路:
1.返回值是void,不需要返回值,在形参char* src 前加了const,确保了源字符串不会被修改,提高了代码安全性。
2.用while循环遍历源字符串,每遍历一个字符就拷贝一个,然后地址++往后走,直到遇到'\0'为止,但是根据上述所说的注意点所知,strcpy会将源字符串中的'\0'拷贝到目标空间,所以当while遍历到'\0'后会跳出循环,此时src指向'\0'的位置,只要在使*dest=*src实现一遍,就可将'\0'拷贝到目标空间。
以下给出在此版本的基础上的优化版本
//优化
//把void改为char*,可以实现链式访问
char* my_strcpy(char* dest, const char* src)
{
assert(dest && src);//避免空指针
char* ret = dest;//循环完后可传回地址,实现链式访问
while (*dest++ = *src++)
{
;
}
return ret;
}
int main()
{
char arr1[20] = { 0 };
char arr2[] = "wdjznb";
my_strcpy(arr1, arr2);
printf("%s\n", arr1);
//printf("%s\n",my_strcpy(arr1, arr2));//优化版本,实现链式访问
return 0;
}
该优化版本
1.返回值写成char*,使得函数能返回地址,从而在main函数中实现链式访问
2.assert断言,避免出现野指针的情况,提高代码的安全性
3.在while循环的条件边遍历边赋值,提高效率,减少代码冗余
4.为了能实现链式访问,创建了指针变量ret接收目标空间的地址
//int main()
//{
// char arr1[20] = "hello\0";//arr2第一个字符会覆盖arr1的\0,同时arr2的\0也会追加过去
// char arr2[] = " bit";
// //strcat(arr1, arr2);//两个数组都必须有\0
// my_strcat(arr1, arr2);
//
// printf("%s\n", arr1);
// return 0;
//}