手动实现 strcpy 函数
strcpy 函数的核心功能是将源字符串(以 '\0' 结尾)复制到目标空间。实现时需注意:
-
处理指针合法性(避免空指针)
-
确保目标空间足够大
-
包含字符串结束符 '\0'
以下是实现代码:
#include <stdio.h>
#include <assert.h>
// 自定义 strcpy 函数
char* my_strcpy(char* dest, const char* src) {
// 断言:确保目标和源指针非空
assert(dest != NULL && src != NULL);
char* ret = dest; // 保存目标指针初始地址,用于返回
// 展开循环步骤
while (1) { // 无限循环,通过内部条件退出
*dest = *src; // 1. 复制当前字符
if (*src == '\0') { // 2. 检查是否到达源字符串末尾
break; // 遇到 '\0' 时退出循环
}
dest++; // 3. 目标指针后移
src++; // 4. 源指针后移
}
return ret; // 返回目标字符串指针
}
// 测试函数
int main() {
char dest[100] = {0};
const char* src = "Hello, World!";
printf("源字符串: %s\n", src);
my_strcpy(dest, src);
printf("复制后: %s\n", dest);
return 0;
}
代码解析
核心逻辑
-
指针断言:通过 assert 确保输入指针有效,避免空指针异常。
-
赋值循环: *dest++ = *src++ 先将源字符复制到目标位置,再同时移动两个指针。当 *src 为 '\0' 时,赋值给 *dest 并终止循环,确保目标字符串以 '\0' 结尾。
-
返回值:返回目标指针初始地址,实现类似标准库 strcpy 的链式调用(如 strcpy(a, strcpy(b, c)) )。
安全注意事项
-
实际使用时,需确保 dest 指向的空间足够大,否则会导致缓冲区溢出。
-
若需增强安全性,可结合 strlen(src) + 1 提前计算空间需求(+1 为 '\0' 预留位置)。
与标准库的兼容性
此实现与 C 标准库 strcpy 的行为一致,但生产环境中建议优先使用标准库函数,并配合 strncpy 等安全版本避免风险。