將 src 追加到 dest 末尾 (覆蓋 dest 的 \0),回傳 dest。dest 必須有足夠空間。
char *my_strcat(char *dest, const char *src) {
char *ret = dest;
while (*dest) dest++; // 移至 \0
while ((*dest++ = *src++)) ; // 複製含 \0
return ret;
}
char s[] = "1234567"; my_strcat(s+3, s); // 嘗試將 "1234567" 追加到 "4567" 後 // 行為未定義:讀取與寫入同一緩衝區,且 src 隨 dest 增長而增長 → 無限循環/崩潰
標準庫 strcat 同樣不保證重疊安全,文檔明確要求不重疊。
strncat(dest, src, n):限制追加長度,保證 \0 結尾。snprintf(dest, size, "%s%s", dest, src):格式化輸出自動處理長度。char *safe_strcat(char *dest, size_t dest_size, const char *src) {
size_t len = strlen(dest);
if (len >= dest_size) return dest;
return strncat(dest, src, dest_size - len - 1);
}