在刷「九度」題目時發現,許多同學為了實現「不調用任何庫函數拼接字符串」,竟然引入了鏈表等重型結構。其實只要牢記 C 風格字符串以 \0 結尾 這一核心特徵,拼接邏輯可以極其簡潔。
strcat, strcpy 等)。i 遍歷 str1,將字符逐個複製到目標緩衝區 str,直到遇到 \0。j 遍歷 str2,接著從 str[i] 開始複製,同樣直到 \0。str[i+j] 處手動寫入 \0,完成拼接。#include <stdio.h>
#include <stdlib.h>
void contact(char *str, const char *str1, const char *str2);
int main() {
char str[201], str1[101], str2[101];
/* scanf 返回 EOF 時結束,完美處理多組測試數據 */
while (scanf("%s%s", str1, str2) != EOF) {
contact(str, str1, str2);
printf("%s\n", str);
}
return 0;
}
/**
* 字符串拼接:str = str1 + str2
* 完全手動實現,零庫函數依賴
*/
void contact(char *str, const char *str1, const char *str2) {
int i, j;
/* 複製 str1 */
for (i = 0; str1[i] != '\0'; i++) {
str[i] = str1[i];
}
/* 接著複製 str2 */
for (j = 0; str2[j] != '\0'; j++) {
str[i + j] = str2[j];
}
/* 關鍵:手動添加字符串結束符 */
str[i + j] = '\0';
}
str 至少要 201 字節(100+100+1),防止溢出。const,防止誤修改並允許傳入字面量。str[i+j] = '\0' 是最常見 Bug,會導致輸出亂碼。strcat?題目明確禁止庫函數;即使不禁止,手寫版本無函數調用開銷、無邊界檢查分支,在極端性能敏感場景下(如嵌入式、高頻調用)反而更優。理解底層機制,才能在需要時做出最優選擇。