首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C++ 不用 strcat 實現字符串連接:正確邏輯與常見錯誤分析

     編輯:程式設計疑難解答

錯誤代碼分析

原代碼嘗試將 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';
}

關鍵點總結

  1. 先定位尾部:單次掃描找到 str1 的 '\0' 位置。
  2. 單循環複製:用一個 while 同時推進讀寫指標。
  3. 補齊結束符:複製結束後必須手動寫入 '\0',否則不是合法 C 風格字符串。
  4. 緩衝區安全:調用方需確保 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,手寫僅供教學理解指針操作。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved