strcat(char *dest, const char *src) 將 src 字串附加到 dest 末尾,返回 dest。關鍵步驟:
dest 字串結尾(\0 位置)。src,包含結尾 \0。dest 指標。#include
#include
char *my_strcat(char *dest, const char *src) {
assert(dest != NULL && src != NULL); // 防禦性程式設計
char *original_dest = dest; // 保存返回值
// 1. 移動到 dest 字串末尾
while (*dest != '\0') {
dest++;
}
// 2. 複製 src(含結尾 \0)
// *dest++ = *src++ 利用賦值運算式返回值特性:
// 先賦值,再遞增指標,當複製到 '\0' 時運算式值為 0,循環結束
while ((*dest++ = *src++) != '\0') {
; // 空主體
}
return original_dest;
}
#include
int main(void) {
char buffer[100] = "Hello, ";
const char *suffix = "World!";
printf("Before: %s\n", buffer);
my_strcat(buffer, suffix);
printf("After : %s\n", buffer);
return 0;
}
| 細節 | 說明 |
|---|---|
| 斷言 | 開發期捕捉空指標,發布版可透過 NDEBUG 關閉 |
| 保存原始指標 | dest 會在循環中移動,必須另存以便返回 |
*dest++ = *src++ | 經典 C 慣用語,緊湊高效,複製包含結尾的 \0 |
| 無長度檢查 | 標準 strcat 不檢查緩衝區溢位,使用者需自行確保 dest 足夠大;實務上建議使用 strncat 或 strlcat |
char *my_strncat(char *dest, const char *src, size_t n) {
assert(dest && src);
char *orig = dest;
while (*dest) dest++;
while (n-- && (*dest++ = *src++)) ;
*dest = '\0'; // 確保以 null 結尾
return orig;
}
理解 strcat 實作有助於掌握 C 字串操作精髓:指標運算、空字元終結慣例、以及「呼叫端負責緩衝區大小」的契約式設計。實際專案中優先使用長度受限版本(strncat、strlcat)或現代安全庫(如 strcat_s),杜絕緩衝區溢位風險。