首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C語言字符串拼接實戰:摒棄庫函數,手寫高效聯接

     編輯:關於C語言

背景:九度 OJ 題目啟發

在刷「九度」題目時發現,許多同學為了實現「不調用任何庫函數拼接字符串」,竟然引入了鏈表等重型結構。其實只要牢記 C 風格字符串以 \0 結尾 這一核心特徵,拼接邏輯可以極其簡潔。

題目要求回顧

  • 輸入:多行,每行兩個長度 ≤ 100 的字符串(以空格分隔)。
  • 輸出:對每組輸入,輸出無冗餘拼接後的字符串。
  • 限制:不得使用任何字符串庫函數(如 strcat, strcpy 等)。

核心思路:雙指標遍歷 + 手動添加結束符

  1. 用索引 i 遍歷 str1,將字符逐個複製到目標緩衝區 str,直到遇到 \0。
  2. 用索引 j 遍歷 str2,接著從 str[i] 開始複製,同樣直到 \0。
  3. 最後在 str[i+j] 處手動寫入 \0,完成拼接。

AC 代碼完整版(含註釋)

#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 正確性:源字符串參數加 const,防止誤修改並允許傳入字面量。
  • 結束符別忘:漏寫 str[i+j] = '\0' 是最常見 Bug,會導致輸出亂碼。

對比:為什麼不用 strcat?

題目明確禁止庫函數;即使不禁止,手寫版本無函數調用開銷、無邊界檢查分支,在極端性能敏感場景下(如嵌入式、高頻調用)反而更優。理解底層機制,才能在需要時做出最優選擇。

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