首先我们先学习一下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;
}
这样模拟实现就非常精简高效的实现了