替换空格

题目:请实现一个函数,把字符串中的每个空格替换成“%20”。例如输入“We are happy.”,则输出“We%20are%20happy.”。

思路:我们可以先遍历一次字符串,这样就能统计出字符串中空格的总数,并可以由此计算出替换之后的字符串的总长度。每替换一个空格,长度增加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 }

 

posted on 2016-07-05 17:18  三颗心  阅读(335)  评论(0编辑  收藏  举报

导航