不能直接用 strcpy 因为目标环境可能无c运行时,手动实现需注意:逐字节拷贝至'\0'、确保目标空间足够、检查空指针、返回dest、不处理重叠;strncpy非安全版,不保证'\0'结尾,易致未定义行为。

为什么不能直接用 strcpy?
因为目标环境可能没链接 C 运行时(比如裸机、bootloader、某些嵌入式 RTOS),或者你在写底层内存操作练习。这时候必须自己实现——但要注意:strcpy 本身不检查目标缓冲区大小,手动实现时若忽略这点,会立刻引入缓冲区溢出漏洞。
strcpy 手动实现的关键细节
核心是逐字节拷贝直到遇到 '\0',且必须确保目标空间足够大(调用者责任)。常见错误包括:忘记复制终止符、指针未判空、源目标重叠时行为未定义(strcpy 不处理重叠)。
- 必须返回
dest指针,以支持链式调用(如printf("%s", strcpy(buf, "hello"));) - 不处理源目标重叠——若需安全,应改用
memmove或手写重叠检测逻辑 - 建议加空指针检查(标准库通常不检查,但你自己实现时加一层更健壮)
char* my_strcpy(char* dest, const char* src) {
if (!dest || !src) return nullptr;
char* ret = dest;
while ((*dest++ = *src++) != '\0') ;
return ret;
}
strncpy 的陷阱比看起来多得多
它不是 strcpy 的“安全版”,而是设计目标不同的函数:固定长度填充、适合固定宽字符串(如 Unix pathname、结构体字段)。最常踩的坑是:不保证结果以 '<p>它不是 <code>strcpy 的“安全版”,而是设计目标不同的函数:固定长度填充、适合固定宽字符串(如 Unix pathname、结构体字段)。最常踩的坑是:不保证结果以 '\0' 结尾,且当 src 长度 ≥ n 时,完全不写入终止符。
src 长度 ≥ n 时,完全不写入终止符。
- 如果
src长度 n,剩余位置必须用'\0'填满——这是强制要求,不是可选项 - 如果
src长度 ≥n,只拷贝前n-1字节,且不加'\0'(即结果不保证是有效 C 字符串) - 参数
n是最大拷贝字节数,不是目标缓冲区大小(但实际使用中二者常等同)
char* my_strncpy(char* dest, const char* src, size_t n) {
if (!dest || !src || n == 0) return dest;
char* ret = dest;
size_t i;
for (i = 0; i <h3>真正安全的替代思路是什么</h3><p>如果你本意是“防止溢出”,<code>strncpy</code> 并不是答案——它导致未终止字符串的问题比溢出更难调试。现代实践中更推荐:</p>
- 用
snprintf(dest, size, "%s", src)(需确保size > 0) - 手写带长度检查的循环,明确在末尾写
'\0'(哪怕只写一个字节) - 在 C++ 中直接用
std::string或std::string_view避免裸指针操作
手动实现时,最容易被忽略的是:你写的 strncpy 版本是否真能和系统库行为一致(比如对 n == 0 或空指针的处理),而这些边界恰恰是 crash 的高发区。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











