cpy相关函数区分

发布于:2025-08-04 ⋅ 阅读:(18) ⋅ 点赞:(0)
函数 安全机制(防溢出) 自动补 \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)。

网站公告

今日签到

点亮在社区的每一天
去签到