如何仅用指针重写strcpy()函数?交换法实现是否可行?
关于用交换法实现strcpy()的疑问解答
首先直接说结论:用交换法实现strcpy()完全不合理,咱们先拆解你的代码问题出在哪,再讲正确的纯指针实现方式。
为什么你的交换实现完全无效?
你写的这段代码:
char *strcpy(char *dest, char *src) { char *ret = dest; dest = src; src = ret; return ret; }
本质上只是交换了函数内部两个局部指针变量dest和src的指向,完全没有修改dest原本指向的内存区域的内容。strcpy的核心需求是把src指向的字符串内容(包括结束符'\0')复制到dest指向的内存里,而你的代码连一次内存赋值都没做,自然完全达不到字符串复制的效果。
交换法为什么不适合实现strcpy?
strcpy的核心是数据复制:把源地址的字节逐个搬到目标地址;而交换操作是交换两个指针变量的指向,这是完全不同的两个逻辑。交换后,只是函数里的局部指针变量值变了,外部的原dest指针指向的内存还是原来的样子,根本没有完成字符串复制的核心任务。所以交换法从逻辑上就和strcpy的需求不匹配,完全不可行。
正确的仅用指针实现strcpy的方式
其实标准的strcpy实现本身就是纯指针操作的,咱们再拆解一下正确的写法:
char *strcpy(char *dest, const char* src) { char *ret = dest; // 提前保存目标地址的起始位置,最后要返回 // 逐个字节复制,直到把src的'\0'也复制过去 while (*dest++ = *src++) { // 这里不需要写循环体,赋值表达式本身会返回赋值的内容,当复制到'\0'时,表达式结果为0,循环终止 } return ret; // 返回目标字符串的起始地址 }
这段代码的指针逻辑拆解:
*dest++ = *src++:这是核心操作——先把src当前指向的字节赋值给dest当前指向的字节,然后两个指针都自增,指向下一个字节。- 循环会一直执行,直到
src指向的'\0'被赋值给dest,此时赋值表达式的结果是'\0'(也就是0),循环条件不满足,自动终止。 - 一开始保存
ret = dest是因为dest会不断自增移动,最后需要返回目标字符串的起始地址,所以得提前存下来。
另外要给src加上const修饰,因为strcpy不会修改源字符串,用const可以让编译器做更多的安全检查,也符合函数的语义。
内容的提问来源于stack exchange,提问作者Mohan
相关产品推荐
相关产品推荐

