字符串拼接是基礎操作,標準庫提供 strcat,但理解其底層邏輯、掌握無庫函數環境下的手寫實現,對嵌入式、面試、底層庫開發至關重要。
strcat(最簡潔)#include
char str1[20] = "Hello ";
char str2[20] = "World!";
puts(strcat(str1, str2)); // 輸出: Hello World!
注意:目標緩衝區必須足夠大,否則緩衝區溢出。
char dest[61], str[3][21];
scanf("%s%s%s", str[0], str[1], str[2]); // 讀入三串
int k = 0;
for (int i=0; i<3; i++)
for (int j=0; j<20; j++) {
if (str[i][j] == '\0') break;
dest[k++] = str[i][j];
}
dest[k] = '\0';
printf("%s", dest);
邏輯:外層遍歷源字符串,內層逐字符拷貝直到 \0,最後補終止符。
char str1[80], str2[30], *p1=str1, *p2=str2;
gets(str1); gets(str2);
while(*p1) p1++; // p1 移至 str1 末尾 \0 處
while(*p2) *p1++ = *p2++; // 逐字符拷貝 str2 到 str1 尾部
*p1 = '\0'; // 補終止符
printf("%s", str1);
優勢:無索引變量、無邊界檢查開銷、單遍歷完成。前提:str1 有足夠空間容納拼接結果。
| 方法 | 可讀性 | 效能 | 適用場景 |
|---|---|---|---|
| strcat | ★★★★★ | ★★★☆☆ | 通用應用、快速開發 |
| 數組循環 | ★★★☆☆ | ★★☆☆☆ | 教學、受限環境、需自定義邏輯(如去重、過濾) |
| 指針操作 | ★★★★☆ | ★★★★★ | 嵌入式、高性能庫、字符串處理框架底層 |
strncat 或手寫帶長度檢查版本:size_t len = strlen(dest); if (len + strlen(src) < SIZE) strcat(dest, src);strcat_s、strncat_s 提供邊界檢查運行時約束。std::string、std::string_view、fmt::format。