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 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)