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

C 語言字串插入演算法實作:將字串2插入字串1首部

     編輯:關於C語言

前言

字串操作是 C 語言基礎訓練核心項目。本文實作一個簡單函式:將字串 s2 插入到字串 s1 的**最前端**,並分析緩衝區安全、指標運算與標準庫替代方案。

演算法邏輯

  1. 計算 len1 = strlen(s1)、len2 = strlen(s2)
  2. 檢查目標緩衝區容量 ≥ len1 + len2 + 1
  3. 從後往前搬移 s1 內容騰出前 len2 空間
  4. 將 s2 複製到開頭
  5. 補上結尾 '\0'

完整程式碼 (修正版)

#include <stdio.h>
#include <string.h>

/* 將 s2 插入 s1 最前端,s1 必須有足夠空間 */
void insert_front(char *s1, const char *s2) {
    size_t len1 = strlen(s1);
    size_t len2 = strlen(s2);

    /* 從後往前搬移 s1,避免覆蓋 */
    for (size_t i = len1; i != (size_t)-1; --i) {
        s1[i + len2] = s1[i];  /* 含結尾 '\0' */
    }
    /* 複製 s2 到開頭 */
    for (size_t i = 0; i < len2; ++i) {
        s1[i] = s2[i];
    }
}

int main(void) {
    char s1[100] = "World";
    char s2[50];

    printf("請輸入要插入的字串: ");
    if (fgets(s2, sizeof(s2), stdin)) {
        /* 移除 fgets 讀入的換行符 */
        s2[strcspn(s2, "\n")] = '\0';
        insert_front(s1, s2);
        printf("結果: %s\n", s1);
    }
    return 0;
}

關鍵修正點

原碼問題修正
gets() 不安全,已被 C11 移除改用 fgets() + strcspn 去換行
函式回傳區域陣列指標 return s3;改為 void 直接在 s1 上操作 (呼叫端負責空間)
迴圈邏輯錯誤:先複製 s2 再搬移 s1 會覆蓋**先搬移 s1 (從後往前),再寫入 s2**
未檢查緩衝區容量實務中應傳入 size_t capacity 並斷言

標準庫替代方案

/* memmove 版:更簡潔、優化過 */
void insert_front_std(char *s1, const char *s2) {
    size_t len1 = strlen(s1);
    size_t len2 = strlen(s2);
    memmove(s1 + len2, s1, len1 + 1);  /* 含 '\0' 向後搬移 */
    memcpy(s1, s2, len2);              /* 寫入開頭 */
}

/* C++ std::string 版:安全、直觀 */
#include <string>
std::string insert_front_cpp(std::string s1, const std::string& s2) {
    return s2 + s1;
}

進階擴展:指定位置插入

/* 在 s1 的 pos 位置插入 s2 (0 ≤ pos ≤ len1) */
void insert_at(char *s1, const char *s2, size_t pos) {
    size_t len1 = strlen(s1);
    size_t len2 = strlen(s2);
    if (pos > len1) pos = len1;  /* 邊界修正 */
    memmove(s1 + pos + len2, s1 + pos, len1 - pos + 1);
    memcpy(s1 + pos, s2, len2);
}

總結

  • 字串插入核心:**從後往前搬移**騰空間,再寫入新內容
  • 必須確保目標緩衝區足夠大,否則導致緩衝區溢位
  • 優先使用 memmove/memcpy 或 C++ std::string
  • 嚴禁使用 gets()、strcat() 等不安全函式
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved