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;
}
while (*dest) dest++; 定位 dest 末尾 \0 位置。while (n-- && (*dest++ = *src++)) ; 精妙的一行:
n-- 先檢查配額,再遞減。*dest++ = *src++ 執行複製,結果為複製的字符值。\0(值 0),邏輯與短路,循環結束(src 結束)。n 歸零,循環結束(達到長度限制)。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 在後)。