网络编程经常存在替换字符串中指定字符为另一种字符,如将字符串中的空格字符替换为“%20”,
例子:
原字符串:we are happy.
替换后字符串:string=we%20are%20happy.
一种思路:
一个空格字符替换成“%20”多了两个字符的位置,所以先遍历一遍字符串,找出字符串中存在的空字符个数N,然后使用N*2加上原来的字符长度即为新的字符长度,之后定义两个游标p1,p2,p1指向原字符串的最后一个字符,而p2指向新字符串的最后一个字符,开始p1向前移动,如果p1指的是字符,则将p1所指向字符复制到p2所指的位置,复制后p2向前移动一步,如碰到空格字符则p2多走两个位置,即将空格位置替换为“%20”。
#include <iostream>
using namespace std;
void ReplaceBlank(char string[],int length){
if(string==nullptr || length <=0)
return;
int spaceNum=0;
int originalLength=0;
int nIndex=0;
while(string[nIndex]!='\0'){
++originalLength;
if(string[nIndex]==' ')
++spaceNum;
++nIndex;
}
int newLength=originalLength+spaceNum*2;
if(newLength>length)
return;
int newIndex=originalLength;
int newEnd=newLength;
while (newEnd>newIndex && newIndex>0)
{
if(string[newIndex]==' '){
string[newEnd--]='0';
string[newEnd--]='2';
string[newEnd--]='%';
}
else{
string[newEnd--]=string[newIndex];
}
--newIndex;
}
}
int main(){
char string[20]="we are happy.";
ReplaceBlank(string,sizeof(string));
cout<<"string="<<string<<endl;
return 0;
}