题目描述:实现一个函数,把字符串中的每个空格替换成“%20”,例如,输入“we are happy”,输出”we%20are%20happy.”
见到这个题目,我们很容易想到:
//申请一块新空间,存储变化后的字符串,显然不是我们想要的结果
char* Replace(char* array)
{
char temp[100] = {0};
int i = 0;
for(int idx=0; array[idx]!='\0'; ++idx)
{
if(array[idx] == ' ')
{
temp[i++] = '%';
temp[i++] = '2';
temp[i++] = '0';
}
else
{
temp[i] = array[idx];
i++;
}
}
temp[i] = '\0';
return temp;
}
由此,我们可以想到如下方法:
(1)先遍历一次字符串,统计出字符串中空格的总数,并可以由此计算出替换之后字符串总长度。每替换一个空格,长度增加2,因此替换以后字符串的长度等于原来的长度加上2乘以空格数目。(2)然后从后往前开始复制替换。首先准备两个指针,p1和p2,p1指向原始字符串的末尾,p2指向那个替换后字符串的末尾,接下来向前移动指针p1,逐个复制它指向的字符到p2所指的位置,遇到空格的话,p1向前移动一个,p2插入“%20”,p2向前移动三个。(3)遇到下一个空格,重复上述过程,等到p1与p2指向同一位置时,表明替换完成。
代码实现如下:
#include<iostream>
using namespace std;
void ReplaceBlank(char string[], int length)
{
if(string == NULL && length <= 0)
{
return;
}
int originLength = 0; //字符串实际长度
int numberofBlank = 0;
int index = 0;
while(string[index])
{
++originLength;
if(string[index] == ' ')
{
++numberofBlank;
}
++index;
}
int newLength = originLength + numberofBlank*2; //替换后字符串长度
if(newLength > length)
{
return;
}
int indexofOrigin = originLength;
int indexofNew = newLength;
while(indexofOrigin >= 0 && indexofNew > indexofOrigin)
{
if(string[indexofOrigin] == ' ')
{
string[indexofNew--] = '0';
string[indexofNew--] = '2';
string[indexofNew--] = '%';
}
else
{
string[indexofNew--] = string[indexofOrigin];
}
--indexofOrigin;
}
}
void FunTest()
{
char array[100] = "we are happy";
ReplaceBlank(array, 20);
for(int idx=0; array[idx]!='\0'; idx++)
{
cout<<array[idx];
}
cout<<endl;
}
int main()
{
FunTest();
system("pause");
return 0;
}