strcpy

一、实现

我们先看函数传递的参数,是两个指针,一个是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

作者:keep--fighting

出处:https://www.cnblogs.com/keep--fighting/p/17741758.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   ⭐⭐-fighting⭐⭐  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
more_horiz
keyboard_arrow_up light_mode palette
选择主题
点击右上角即可分享
微信分享提示