經典面試題:實現函數將字符串中每個空格替換為 %20。例如 "we are happy" → "we%20are%20happy"。本文提供兩種思路:雙指針原地替換(從後向前)與輔助函數逐字符輸出。
void replaceSpace(char *str, int bufferSize) {
if (!str) return;
int originalLen = 0, spaceCount = 0;
while (str[originalLen] != '\0') {
if (str[originalLen] == ' ') spaceCount++;
originalLen++;
}
int newLen = originalLen + spaceCount * 2; // 每空格多 2 字符
if (newLen + 1 > bufferSize) return; // 緩衝區不足
int i = originalLen, j = newLen;
str[j--] = '\0'; // 先寫結束符
while (i >= 0) {
if (str[i] == ' ') {
str[j--] = '0';
str[j--] = '2';
str[j--] = '%';
} else {
str[j--] = str[i];
}
i--;
}
}
關鍵點:先計算新長度、檢查緩衝區、從尾部向前填充、空格展開為 '%','2','0'。
int checkSpace(char c) {
return (c == ' ') ? 1 : 2; // 1=空格, 2=非空格
}
int main() {
char arr[] = "we are happy.";
char *p = arr;
while (*p != '\0') {
int ret = checkSpace(*p);
if (ret == 1) printf("%%20");
else printf("%c", *p);
p++;
}
printf("\n");
return 0;
}
此法僅演示邏輯,實際工程需寫入緩衝區而非直接 printf。
int main() {
char buf[100] = "we are happy.";
replaceSpace(buf, sizeof(buf));
printf("%s\n", buf); // 輸出: we%20are%20happy.
return 0;
}
str_replace 或動態字符串庫,手寫僅用於受限環境或面試。