首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C 語言字串複製陷阱:strcpy vs memcpy 處理內嵌 \\0 的差異

     編輯:關於C語言

核心差異

函數原型停止條件適用場景
strcpychar *strcpy(char *dest, const char *src)遇到 \0 結束以 \0 結尾的 C 字串
memcpyvoid *memcpy(void *dest, const void *src, size_t n)複製指定 n 位元組任意二進位資料、含內嵌 \0 的緩衝區

含 \0 字串複製正確姿勢


// 來源緩衝區包含內嵌 \0,已知總長度 len
char src[] = {'a', 'b', '\0', 'c', 'd'};  // 長度 5
char dest[5];

// ❌ 錯誤:strcpy 遇到第一個 \0 停止,只複製 "ab"
strcpy(dest, src);  // dest = "ab\0??"

// ✅ 正確:memcpy 複製完整 5 位元組
memcpy(dest, src, 5);  // dest = "ab\0cd"

memcpy 使用關鍵注意事項

  1. 目的緩衝區必須預先分配足夠空間:dest 指向至少 n 位元組可寫記憶體。
  2. 記憶體區域不可重疊:重疊行為未定義,需用 memmove。
  3. 不自動添加 \0:若需 C 字串,手動 dest[n] = '\0'。

常見錯誤:未初始化 dest


char *dest;  // 未分配記憶體!
memcpy(dest, src, len);  // 段錯誤:寫入野指標

// 正確
char *dest = malloc(len);
if (dest) memcpy(dest, src, len);

總結選擇指南

已知長度、可能含 \0、二進位資料 → memcpy / memmove
標準 C 字串 (單一 \0 結尾)         → strcpy / strncpy / strlcpy
字串拼接                              → strcat / strncat / strlcat
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved