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

C 語言字串核心函數 strcpy 與 strcat 實現原理與安全避坑指南

     編輯:更多程式設計知識

strcpy 與 strcat 是 C 字串操作最基礎也最危險的兩個函數。本文解析標準庫實現邏輯,揭示緩衝區溢位根源,提供安全替代方案。

strcpy:字串複製

原型

char* strcpy(char* dest, const char* src);

標準實現(簡化版)

char* strcpy(char* dest, const char* src) {
    char* ret = dest;
    assert(dest != NULL && src != NULL);
    while ((*dest++ = *src++) != '\0'); // 複製含結尾 \0
    return ret;
}

危險點

  • 不檢查 dest 容量,src 過長必導致緩衝區溢位
  • src 與 dest 重疊行為未定義

strcat:字串拼接

原型

char* strcat(char* dest, const char* src);

標準實現邏輯

char* strcat(char* dest, const char* src) {
    char* ret = dest;
    assert(dest && src);
    while (*dest) dest++;      // 找到 dest 結尾 \0
    while ((*dest++ = *src++)); // 接上 src 含 \0
    return ret;
}

危險點

  • 同樣不檢查剩餘空間
  • 需確保 dest 有足夠空間容納原字串 + src + \0

安全替代方案

函數標準特性
strncpyC89指定最大複製字元數,但不保證以 \0 結尾
strncatC89指定最大拼接字元數,保證 \0 結尾
snprintfC99推薦:snprintf(dest, size, "%s", src) 複製;snprintf(dest, size, "%s%s", dest, src) 拼接,自動處理 \0 與截斷
strcpy_s / strcat_sC11 Annex KMicrosoft 推廣,帶邊界檢查,回傳錯誤碼

最佳實踐

  1. 永遠使用 snprintf 或 strncat + 手動保證 \0
  2. 配合 sizeof(buffer) 傳遞大小,避免硬編碼
  3. 字串長度追蹤:維護 size_t len 變數,避免重複 strlen
  4. C++ 專案直接用 std::string,彈性且安全

常見錯誤範例

char buf[10];
strcpy(buf, "Hello World");  // 溢位!需 12 字元含 \0
strcat(buf, "!");            // 疊加溢位

// 正確
snprintf(buf, sizeof(buf), "%s", "Hello"); // 複製
snprintf(buf, sizeof(buf), "%s!", buf);    // 拼接
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved