思路:我們可以先遍歷一次字符串,這樣就能統計出字符串中空格的總數,並可以由此計算出替換之後的字符串的總長度。每替換一個空格,長度增加2,因此替換以後字符串的長度等於原來的長度加上2乘以空格數目。我們以字符串"We are happy."為例,"We are happy."這個字符串的長度是14(包括結尾符號'\0'),裡面有兩個空格,因此替換之後字符串的長度是18。
我們從字符串的後面開始復制和替換。首先准備兩個指針,P1和P2。P1指向原始字符串的末尾,而P2指向替換之後的字符串的末尾(如圖(a)所示)。接下來我們向前移動指針P1,逐個把它指向的字符復制到P2指向的位置,直到碰到第一個空格為止。此時字符串包含如圖(b)所示,灰色背景的區域是做了字符拷貝(移動)的區域。碰到第一個空格之後,把P1向前移動1格,在P2之前插入字符串"%20"。由於"%20"的長度為3,同時也要把P2向前移動3格如圖(c)所示。
我們接著向前復制,直到碰到第二個空格(如圖(d)所示)。和上一次一樣,我們再把P1向前移動1格,並把P2向前移動3格插入"%20"(如圖(e)所示)。此時P1和P2指向同一位置,表明所有空格都已經替換完畢。

1 #include <string>
2 #include "stdafx.h"
3
4 void ReplaceBlank(char string[], int length)
5 {
6 if(string == NULL && length <= 0)
7 return;
8
9 int originalLength = 0;
10 int numberOfBlank = 0;
11 int i = 0;
12
13 while(string[i] != '\0')
14 {
15 ++ originalLength;
16
17 if(string[i] == ' ')
18 ++ numberOfBlank;
19
20 ++ i;
21 }
22
23 //newLength 為把空格替換為'%20'之後的長度
24 int newLength = originalLength + numberOfBlank * 2;
25 if(newLength > length)
26 return;
27
28 int indexOfOriginal = originalLength;
29 int indexOfNew = newLength;
30
31 //若沒有空格 直接跳過
32 while(indexOfOriginal >= 0 && indexOfNew > indexOfOriginal)
33 {
34 if(string[indexOfOriginal] == ' ')
35 {
36 string[indexOfNew --] = '0';
37 string[indexOfNew --] = '2';
38 string[indexOfNew --] = '%';
39 //先使用再減一
40 }
41 else
42 {
43 string[indexOfNew --] = string[indexOfOriginal];
44 }
45
46 -- indexOfOriginal;
47 }
48 }
49
50 int main()
51 {
52 const int length = 100;
53
54 char string[length] = "We are happy";
55 printf("%s\n",string);
56 ReplaceBlank(string, length);
57 printf("%s\n",string);
58
59 char string1[length] = " ";
60 printf("%s\n", string1);
61 ReplaceBlank(string1, length);
62 printf("%s\n", string1);
63
64 return 0;
65 }
