OJ 題目:將字符數組中所有空格刪除,後續字符前移。例如 "a b c" → "abc"。常見錯誤寫法:嵌套循環移動導致 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]; 放在循環外 | 未及時截斷,殘留垃圾字符 |
#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 字符串題。