原代碼嘗試將 str2 追加到 str1 尾部,但邏輯存在嚴重缺陷:
void link(char str1[], char str2[]) {
for (int i = 0, j = 0; str2[j] != '\0'; i++, j++) {
while (str1[i] != '\0') { i++; } // 每次外層循環都從頭掃描
str1[i] = str2[j];
}
}
問題:
for 循環的 i++ 導致寫入位置錯位。while 每次都從 str1[0] 開始找結尾,效率極低且邏輯錯亂。'\0' 寫入,導致輸出亂碼(如 chinachiΓFnese)。void link2(char str1[], char str2[]) {
int i = 0, j = 0;
// 1. 找到 str1 當前結尾
while (str1[i] != '\0') i++;
// 2. 逐字符複製 str2 到 str1 尾部
while (str2[j] != '\0') {
str1[i++] = str2[j++];
}
// 3. 關鍵:補上字符串結束符
str1[i] = '\0';
}
str1 的 '\0' 位置。while 同時推進讀寫指標。'\0',否則不是合法 C 風格字符串。str1 有足夠空間(原代碼 char str1[180] 足夠)。void safe_link(char* dest, size_t destSize, const char* src) {
size_t len = strlen(dest);
if (len >= destSize) return; // 已滿
size_t remain = destSize - len - 1; // 留一位給 '\0'
strncat(dest, src, remain); // 實際可直接用標準庫
}
實際工程中優先使用 std::string 或 strncat,手寫僅供教學理解指針操作。