函数 | 安全机制(防溢出) | 自动补 \0 |
处理非字符串 | 适用场景 | 关键差异 |
---|---|---|---|---|---|
strcpy |
无(不限制长度) | 是 | 否 | 已知长度的字符串复制 | 无长度限制,易溢出 |
strncpy |
有(限制 n 字符) |
否(可能) | 否 | 需控制长度,需手动补 \0 |
超长时不补 \0 ,可能填充空字符 |
strlcpy |
有(限制 size 字节) |
是 | 否 | 安全字符串复制(推荐) | 返回 src 总长度,可判断截断 |
memcpy |
有(限制 n 字节) |
否 | 是 | 二进制数据(结构体、数组) | 按字节复制,不处理字符串逻辑 |
函数调用 | dest 结果(内存内容) |
说明 |
---|---|---|
strcpy(dest, src) |
h e l l o w (无 \0 ) |
溢出,无 \0 ,不安全 |
strncpy(dest, src, 5) |
h e l l o (无 \0 ) |
复制 5 字符,不补 \0 ,需手动处理 |
strlcpy(dest, src, 6) |
h e l l o \0 |
复制 5 字符 + \0 ,返回 11(src 长度) |
memcpy(dest, src, 5) |
h e l l o (无 \0 ) |
仅复制 5 字节,不处理字符串逻辑 |
1. strcpy
:最基础但不安全的复制
- 函数原型:
char *strcpy(char *dest, const char *src);
- 功能:将
src
指向的字符串(包含\0
)完整复制到dest
,直到遇到src
的\0
为止。 - 特点:
- 不检查
dest
缓冲区大小,若src
长度超过dest
容量,会导致缓冲区溢出(覆盖其他内存)。 - 自动复制
src
的结束符\0
到dest
。
- 不检查
- 适用场景:仅在确定
src
长度小于dest
时使用(如常量字符串复制)。
2. strncpy
:有限制的复制(部分安全)
- 函数原型:
char *strncpy(char *dest, const char *src, size_t n);
- 功能:最多复制
n
个字符从src
到dest
。 - 特点:
- 限制复制长度为
n
,避免缓冲区溢出(相比strcpy
更安全)。 - 关键缺陷:
- 若
src
长度 >=n
,则不会在dest
末尾添加\0
(可能导致dest
不是合法字符串)。 - 若
src
长度 <n
,会用\0
填充剩余空间(直到凑满n
个字符,可能浪费空间)。
- 若
- 限制复制长度为
3. strlcpy
:更安全的复制(非标准但推荐)
- 函数原型(POSIX 扩展,部分系统支持):
size_t strlcpy(char *dest, const char *src, size_t size);
- 功能:复制
src
到dest
,确保dest
以\0
结尾,且总长度不超过size-1
。 - 特点:
- 安全性高:自动在
dest
末尾添加\0
(即使src
超长,也会截断并补\0
)。 - 返回值:
src
的总字节长度(方便判断是否被截断)。 - 不填充多余
\0
(相比strncpy
更高效)。
- 安全性高:自动在
4. memcpy
:二进制数据复制(不限于字符串)
- 函数原型:
void *memcpy(void *dest, const void *src, size_t n);
- 功能:从
src
复制n
个字节到dest
(按二进制复制,不关心\0
)。 - 特点:
- 适用于任何数据(字符串、数组、结构体等),不仅限于字符串。
- 不处理
\0
(即使复制字符串,也需手动确保\0
被包含)。 - 若
src
和dest
内存重叠,可能导致未定义行为(此时应使用memmove
)。