函数简介
strcpy - string copy 函数 - 字符串拷贝
#include
#include
int main()
{
char arr1[20] = { 0 };
char arr2[] = "hello world";
printf("%s\n", strcpy(arr1, arr2));
return 0;
}
使用库函数可实现字符串拷贝,现模拟实现my_strcpy
字符串拷贝,本质上是字符拷贝+字符++
#include
void my_strcpy(char* des,char* src)
{
while (*src != '\0')
{
*des = *src;
*des++;//数组向后移动一位
*src++;
}
*des = *src;//这里将'\0'进行拷贝
}
int main()
{
char arr1[20] = { 0 };
char arr2[20] = "hello world";
my_strcpy(arr1, arr2);//数组名就是数组首元素地址
printf("%s\n",arr1);
return 0;
}
这串代码还可以优化
#include
void my_strcpy(char* des,char* src)
{
while (*des++ = *src++)//des src 解引用后自加1,自动跳到下一个字符,使代码简化
{
;//空语句
}
}
int main()
{
char arr1[20] = {0};
char arr2[] = "hello world";
my_strcpy(arr1, arr2);
printf("%s\n",arr1);
return 0;
}
这串代码已经可以实现字符串拷贝了,但它含有问题,如果字符串arr1为NULL空指针时,char* des 就为野指针了,这个程序就会有bug
为防止传递NULL指针,可以使用assert(link)函数进行断言处理
这里使用NULL测试下
#include
#include
void my_strcpy(char* des, char* src)
{
assert(des != NULL);
assert(src != NULL);
while (*des++ = *src++)
{
;//空语句
}
}
int main()
{
char arr1 = NULL;
char arr2[] = "hello world";
my_strcpy(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
为防止在模拟实现的过程中,des 与 src 表示不清而使程序出现失误,我们应该加const进行修饰
#include
#include
void my_strcpy(char* des,const char* src)
{
assert(des != NULL);
assert(src != NULL);
while (*des++ = *src++)//这里写反时,由于const修饰,会报错
{
;//空语句
}
}
int main()
{
char arr1[20] = {1};
char arr2[20] = "hello world";
my_strcpy(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
但编写函数时我们使用的是void函数,而cplusplus.com上提供了char*类型, 故代码还可以进行优化
最终版本:
#include
#include
char* my_strcpy(char* des, const char* src)
{
assert(*des && *src);
char* ret = des;//创建指针变量存放des 字符串
while (*des++ = *src++)
{
;
}
return ret;//返回的是字符串数组的首元素地址
}
int main()
{
char arr1[20];
char arr2[] = "hello world";
printf("%s\n", my_strcpy(arr1, arr2));//连式访问
//'\0'是字符串结束的标志,打印时遇到\0打印结束。
return 0;
}