手撕字符串拷贝函数
2026/8/21大约 1 分钟
手撕字符串拷贝函数
C 语言字符串本质上是以 '\0' 结尾的字符数组。strcpy() 复制整个字符串,包括最后的 '\0';strncpy() 最多复制 n 个字符。(Cppreference)
1. 手撕 strcpy
char* my_strcpy(char* dest, const char* src)
{
char* address = dest;
while ((*dest++ = *src++) != '\0');
return address;
}核心:
src取字符
↓
写入dest
↓
两个指针++
↓
遇到'\0'停止保存 address 是因为 dest 会不断向后移动,最后要返回目标字符串的首地址。
注意: dest 必须有足够空间,否则会发生未定义行为。(Cppreference)
2. 手撕 strncpy
char* my_strncpy(char* dest, const char* src, size_t len)
{
char* address = dest;
// 复制字符
while (len > 0 && *src != '\0')
{
*dest++ = *src++;
len--;
}
// src提前结束,剩余位置补'\0'
while (len > 0)
{
*dest++ = '\0';
len--;
}
return address;
}核心就是两步:
① 复制,直到 src结束 或 len用完
② 如果 src提前结束
剩余位置全部填 '\0'特别注意:
strncpy(dest, "abcdef", 3);结果只有:
a b c不会自动补 '\0'。(Cppreference)
比如:

3. 面试直接记
strcpy:
复制到 '\0' 为止
strncpy:
最多复制 n 个
src提前结束 → 剩余补 '\0'
n先用完 → 不保证 '\0'手撕的核心不是背代码,而是记住这两个停止条件。

