You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何仅用指针重写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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:38:55