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

C語言字串替換空格:%20 原地替換雙指標法完整解析

     編輯:關於C

問題描述

將字串中每個空格 `' '` 替換為 `"%20"`。假設字串緩衝區足夠大(或已預留空間)。

核心洞察:從後往前處理

  • 從前往後會覆蓋未處理字元(`%20` 比空格長 2 字元)。
  • 先統計空格數 → 計算新長度 → 雙指標從尾部向前複製/替換。

完整演算法步驟

  1. 掃描字串,統計空格數 `count`。
  2. 新長度 `new_len = old_len + 2*count`。
  3. 雙指標:`i = old_len-1`(舊尾),`j = new_len-1`(新尾)。
  4. `while (i >= 0)`:
    • 若 `s[i] != ' '` → `s[j--] = s[i--]`
    • 若 `s[i] == ' '` → `s[j--]='0'; s[j--]='2'; s[j--]='%'; i--`
  5. 直到 `i < 0` 完成。

完整程式碼

#include 

void replace_spaces(char *s, int buffer_size) {
    int old_len = strlen(s);
    int space_count = 0;
    for (int i = 0; i < old_len; i++)
        if (s[i] == ' ') space_count++;

    int new_len = old_len + 2 * space_count;
    if (new_len >= buffer_size) return; // 緩衝區不足(或擴容)

    int i = old_len - 1;
    int j = new_len - 1;
    while (i >= 0) {
        if (s[i] != ' ') {
            s[j--] = s[i--];
        } else {
            s[j--] = '0';
            s[j--] = '2';
            s[j--] = '%';
            i--;
        }
    }
    s[new_len] = '\0';
}

int main() {
    char str[100] = "we are happy.";
    replace_spaces(str, sizeof(str));
    printf("%s\n", str); // we%20are%20happy.
    return 0;
}

關鍵細節

  • `buffer_size` 參數確保不越界,生產碼必須檢查。
  • 迴圈條件 `i >= 0` 而非 `i != j`,因 `j` 移動較快。
  • 替換順序 `'0','2','%'` 因從後往前寫入。
  • 時間 O(n),空間 O(1)。

標準庫替代

若無原地限制:`snprintf` 寫入新緩衝區,或動態分配新字串。但面試通常考察**原地雙指標法**。

總結

字串替換空格 = **統計擴展長度 + 雙指標從後往前**。這是「原地修改陣列/字串」通用模式:先算新長度,再反向搬移。同樣適用於「移除元素」、「複製陣列」、「合併兩個有序陣列」等題型。

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