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

C 語言手寫 strncat:指針版實現與空字符處理細節

     編輯:關於C語言

C 語言手寫 strncat:指針版實現與空字符處理細節

strncat(dest, src, n) 將 src 前 n 字符追加到 dest 末尾,並確保結果以 \0 結尾。本文實現指針版 my_strncat,分析空字符處理邏輯。

一、 標準行為

  • 找到 dest 末尾 \0。
  • 複製 src 最多 n 字符(遇 src 的 \0 提前停止)。
  • 追加結尾 \0。
  • 返回 dest。

二、 指針實現

char *my_strncat(char *dest, const char *src, size_t n) {
    char *start = dest;
    assert(dest && src);
    // 1. 移動到 dest 末尾
    while (*dest) dest++;
    // 2. 複製最多 n 字符
    while (n-- && (*dest++ = *src++)) ; // 賦值表達式結果為賦值後的字符,\0 為 0 結束循環
    // 3. 確保結尾 \0
    *dest = '\0';
    return start;
}

三、 關鍵細節解析

  1. while (*dest) dest++; 定位 dest 末尾 \0 位置。
  2. while (n-- && (*dest++ = *src++)) ; 精妙的一行:
    • n-- 先檢查配額,再遞減。
    • *dest++ = *src++ 執行複製,結果為複製的字符值。
    • 若複製字符為 \0(值 0),邏輯與短路,循環結束(src 結束)。
    • 若 n 歸零,循環結束(達到長度限制)。
  3. 循環結束後 dest 指向最後複製字符的下一位,直接 *dest = '\0' 補尾。

四、 測試驗證

int main() {
    char dest[20] = "i love";
    char src[10] = " China";
    printf("%s\n", my_strncat(dest, src, 4)); // 輸出: i love Chi
    return 0;
}

五、 常見錯誤

  • 忘記補尾 \0,導致字符串非法。
  • 未檢查 dest 緩衝區大小,造成溢出(標準庫不檢查,由調用者保證)。
  • 參數順序搞反(dest 在前,src 在後)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved