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

strlen 與 strcpy 關鍵差異:長度計算 vs 內存拷貝(含 \0 陷阱)

     編輯:C++ 入門

核心區別一覽

特性strlenstrcpy
功能返回字符串長度(不含 \0)拷貝字符串(含 \0)
返回值size_t 長度char* 目的地址
停止條件遇到 \0 停止計數遇到 \0 停止拷貝(並拷貝 \0)
緩衝區要求無寫入,僅讀取目的緩衝區必須 ≥ 源長度+1

經典錯誤示例

char *str = "hello";        // 長度 5,含 \0 共 6 字節
int len = strlen(str);      // len = 5
char buf[5];                // ❌ 僅 5 字節,不足存 \0
strcpy(buf, str);           // 寫入 6 字節 → 緩衝區溢出,未定義行為
// 正確做法:
char buf2[6];               // 或 sizeof("hello") = 6
char *buf3 = new char[strlen(str) + 1];

安全使用建議

  1. 分配時 +1:dst = new char[strlen(src) + 1];
  2. 用 sizeof 字面量:char buf[sizeof("hello")]; 自動包含 \0。
  3. 優先用安全版本:strncpy(需手動補 \0)、strcpy_s (C11/MSVC)、std::string(C++ 首選)。

底層實現參考

size_t strlen(const char *s) {
    size_t len = 0;
    while (*s++) ++len;
    return len;
}
char *strcpy(char *dst, const char *src) {
    char *ret = dst;
    while ((*dst++ = *src++)); // 賦值同時檢查 \0
    return ret;
}

理解「是否包含 \0」是區分兩者行為的根本,也是 C 字符串操作最常見的坑點之一。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved