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

C 語言去除字符串空格:雙指針原地壓縮算法詳解

     編輯:程式設計綜合問答

OJ 題目:將字符數組中所有空格刪除,後續字符前移。例如 "a b c" → "abc"。常見錯誤寫法:嵌套循環移動導致 O(n²) 且易越界。

標準雙指針 O(n) 單趟掃描

void removeSpaces(char *str) {
    if (!str) return;
    int write = 0;          // 寫指針:下一個非空格字符存放位置
    for (int read = 0; str[read]; ++read) { // 讀指針:掃描每個字符
        if (str[read] != ' ') {
            str[write++] = str[read]; // 非空格則寫入並前移寫指針
        }
    }
    str[write] = '\0'; // 截斷尾部殘留
}

關鍵點圖解

原始:  a  _  b  _  c  \0
        ↑     ↑     ↑
        r     r     r   (read 掃描)
        w     w     w   (write 寫入非空格)
結果:  a  b  c  \0  _  _
             ↑
             write 位置截斷

常見錯誤對比

錯誤寫法問題
for(p=a; *p; p++) if(*p==' ') for(q=p; *(q+1); q++) *q=*(q+1);嵌套循環 O(n²),多次移動同一字符,易漏掉連續空格
str[k]=str[i]; 放在循環外未及時截斷,殘留垃圾字符

完整可運行 Demo

#include 
#include 

void removeSpaces(char *str) {
    int w = 0;
    for (int r = 0; str[r]; r++)
        if (str[r] != ' ') str[w++] = str[r];
    str[w] = '\0';
}

int main() {
    char s[] = "  a b  c d  ";
    printf("原始: [%s]\n", s);
    removeSpaces(s);
    printf("結果: [%s]\n", s); // 輸出: [abcd]
    return 0;
}

擴展:去除所有空白字符 (空格、制表、換行)

if (!isspace((unsigned char)str[read])) str[write++] = str[read];

雙指針「讀寫分離」是字符串原地修改、數組去重、移動零等題型的通用模板,熟練掌握能秒殺大批 OJ 字符串題。

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