替换空格
题目:请实现一个函数,把字符串中的每个空格替换成“%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 }