大家在看本文之前如果还不了解strcpy函数的话
可以参考一下我写的这篇博客:strcpy函数详解
1、给模拟函数起个名字
先给模拟实现的函数起个名吧,就叫my_strcpy
然后创建一个字符型数组arr1(目标地址),再定义一个字符型指针arr2并指向字符常量“hello bit”,把arr1和arr2传给my_strcpy函数
int main() { char arr1[15] = { 0 }; char* arr2 = "hello bit"; my_strcpy(arr1, arr2); printf("%s\n", arr1); return 0; }
2、定义my_strcpy函数,并写出my_strcpy的原型
因为my_strcpy函数接受的是两个空间地址,所以两个参数类型都是字符型指针 。同时第二个参数是要拷贝的内容(源头数据),不能改变所以要再加个const 来进行一定的保护,让代码健壮性更高。 返回值类型为char*
char* my_strcpy(char* dest, const char* src) { }
3、实现my_strcpy函数功能
实现功能之前,我们必须要了解strcpy的原理,在strcpy传参的过程中arr2传给了src,arr1传给了dest,而dest作为变量存的是arr1的其实地址。接下来我们要把src中的字符存到dest中去,怎么做呢,解引用src找到‘h’,放到*dest中去,之后src++、dest++知道遇到'\0'结束。同时我们要定义一个指针变量ret来存储dest的其实位置,用来当做返回值
为了保证函数不接受空指针,所以我加了一个断言assert来判断src和dest
我们看如下代码,大家看看有没有什么问题
char* my_strcpy(char* dest, const char* src) { //assert(dest != NULL); //assert(src != NULL); assert(src && dest); char* ret = dest; while (*src != '\0') { *dest = *src; dest++; src++; } return ret; }
我们回到最初strcpy上,strcpy会把src中的‘\0’拷贝到dest中。但是上面while循环循环到“*dest = '\0' ”时就结束赋值了,所以并没有把‘\0’赋值给dest。
当我们在while循环后添加一句话就能解决那个问题啦
*dest = *src;// \0
虽然功能已经实现了,但是中感觉这种写法不干脆利索,所以我提供了另一种写法
在次之前,要先说一个知识点 ‘赋值表达式返回值’,这个表达式(*dest=*src)的返回值为*src的值比如*src的值为1那返回值就为1,要是*src的值为‘\0’那返回值就为0。
所以改造后的代码如下,是不是简洁多了
char* my_strcpy(char* dest, const char* src) { //assert(dest != NULL); //assert(src != NULL); assert(src && dest); char* ret = dest; while (*dest++ = *src++) { ; } return ret; }
完整实现代码如下
char* my_strcpy(char* dest, const char* src) { //assert(dest != NULL); //assert(src != NULL); assert(src && dest); char* ret = dest; while (*dest++ = *src++) { ; } return ret; }