首先我们先学习一下strcpy是怎么用的
#include <string.h>
int main()
{
char arr1[] = "hello world";
char arr2[30] = { 0 };
strcpy(arr2, arr1);
printf("%s", arr2);
return 0;
}
现在我们就要思考如何模拟实现了
代码的初步实现非常简单哈~
char* my_strcpy(char* dest,const char* src)
{
while (*src != '\0')
{
*dest = *src;
src++;
dest++;
}
*dest = *src;
}
第一步优化:
char* my_strcpy(char* dest, const char* src)
{
while (*src != '\0')
{
*dest++ = *src++;//后置++可以简化
}
*dest = *src;
}
再次优化:
char* my_strcpy(char* dest, const char* src)
{
while (*dest++ = *src++)//等\0赋值过去,表达式为0,判断为假
{
;
}
}
最后我们还能加入断言,限制传来的不能是空指针
char* my_strcpy(char* dest, const char* src)
{
assert(dest != NULL);
assert(src != NULL);
while (*dest++ = *src++)
{
;
}
}
不过断言其实也有简化写法
char* my_strcpy(char* dest, const char* src)
{
assert(dest);//如果是空指针,就是0,直接为假,就会报警
assert(src);
while (*dest++ = *src++)
{
;
}
}
或者再简写:
char* my_strcpy(char* dest, const char* src)
{
assert(dest && src);//有一个为假就报警
while (*dest++ = *src++)
{
;
}
}
最后把返回值补充一下,库函数会返回目标空间的起始地址,实际上返回的就是dest
那我们就需要提前存一份
char* my_strcpy(char* dest, const char* src)
{
assert(dest && src);
char* ret = dest;//提前存一份
while (*dest++ = *src++)
{
;
}
return ret;
}
这样模拟实现就非常精简高效的实现了