一、实现
我们先看函数传递的参数,是两个指针,一个是strSource(字符串的源头),另一个是strDestination(字符串的目的地),因此,我们也需要传递两个指向字符串地址的指针。
而我们知道库里的strcpy函数会传递源头字符串末尾的'\0',因此我么可以这样来写代码。
代码如下:
include<stdio.h>
void my_strcpy(char* dest, char* sou)
{
while (sou != '\0')
{
dest = sou;
dest++;
sou++;
}
}
int main()
{
char arr1[] = "Hello World!";
char arr2[] = "************";
my_strcpy(arr2, arr1);
return 0;
}
这种写法只能模拟基本功能,如果满分为10分,上述代码只能得5分,还有很多的优化空间。
二、优化
我们根据后置++的特性,以及'\0'的本质为0,我么们可以将判断和循环条件同时改变。
代码如下:
include<stdio.h>
void my_strcpy(char* dest, char* sou)
{
while (dest++=sou++)
{
;
}
}
int main()
{
char arr1[] = "Hello World!";
char arr2[] = "***************";
my_strcpy(arr2, arr1);
return 0;
}
然而这串代码有一个致命缺陷,我们可能会一不小心将来源与目的地的指针传成空指针,导致函数错误
这时我们想到可以加入’‘断言’‘
include<stdio.h>
include<assert.h>
void my_strcpy(char* dest, char* sou)
{
assert(dest && sou);
while (*dest++=*sou++)
{
;
}
}
int main()
{
char arr1[] = "Hello World!";
char arr2[] = "***************";
my_strcpy(arr2, arr1);
return 0;
}
当我们传错参时它会提醒我们。
我们可能会更加粗心,直接将目的地与来源的指针传反,这时我们可以使*sou的值不能改变来避免。我们可以使用const来修饰sou
include<stdio.h>
include<assert.h>
void my_strcpy(char* dest,const char* sou)
{
assert(dest && sou);
while (*dest++=*sou++)
{
;
}
}
int main()
{
char arr1[] = "Hello World!";
char arr2[] = "***************";
my_strcpy(arr2, arr1);
return 0;
}
当我们仔细查看strcpy函数的定义是发现strcpy函数是有返回值的,返回类型为char*。strcpy函数的返回值我们可以形成函数的链式访问
include<stdio.h>
include<assert.h>
char * my_strcpy(char* dest,const char* sou)
{
assert(dest && sou);
char* ret = dest;
while (dest++=sou++)
{
;
}
return ret;
}
int main()
{
char arr1[] = "Hello World!";
char arr2[] = "***************";
printf("%s", my_strcpy(arr2, arr1));
return 0;
}
————————————————
版权声明:本文为CSDN博主「真的王」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_62179366/article/details/123098864