您的位置:首页 > 其它

替换字符串中的空格

2014-02-26 21:28 148 查看
题目描述:给定一个字符串,比如” I am a student."。将字符串中的空格替换为%20。那么替换后的字符串为“I%20am%20a%20student.”

思路:(1)从头到尾遍历整个字符串,碰到空格,就移动后面的字符串,每次需要向后移动2个字节。(移动非常耗时。)

    (2)遍历一遍数组,统计出来整个字符串中有多少个空格,然后可以确定替换之后的字符串的长度,替换空格,生成新的字符串。

思路(2)注意事项:替换空格,生成新的字符串的时候,需要使用2个指针P1,P2,从后向前开始替换。其中,P1指向源字符串的末尾,P2指向替换后的新字符串的末尾。然后依次向前移动指针,逐个把它指向的字符赋值到P2所指示的位置处,直到碰到空格为止。当碰到空格时,P1向前一位,P2依次向前填充0,2,%。迭代继续,直到完成。

之所以选择从后向前是因为:替换后的新字符串是在源字符串原来占有的内存空间上新生成的,只不过比之间的字符串后面多用了 2*空格数 个字节。

基于思路2,写如下代码:

#include <iostream>
#include <string>
#include <string.h>
using namespace std;

void ReplaceBlank(char str[], int length)//length为给定的最大长度限制
{
int count=0;//统计空格数
int i=0;
int originalLength=0;
while(str[i]!='\0')
{
originalLength++;
if(str[i++]==' ')
count++;
}

int newLength=originalLength+count*2;
if(newLength>length)
{
cout<<"超出了最大长度限制!"<<endl;
return;
}
int indexOfOriginal=originalLength;
int indexofNew=newLength;
while(indexOfOriginal>=0&&indexofNew>indexOfOriginal)
//indexofNew>indexOfOriginal保证了indexofNew也是一直>=0的
{
if(str[indexOfOriginal]!=' ')
{
str[indexofNew]=str[indexOfOriginal];
indexOfOriginal--;
indexofNew--;
}
else
{
indexOfOriginal--;
str[indexofNew--]='0';
str[indexofNew--]='2';
str[indexofNew--]='%';
}
}
cout<<"替换后的字符串为:"<<endl;
cout<<str<<endl;
}

int main()
{
int length=100;
char str[length];
cout<<"您要替换的字符串为:"<<endl;
cin.getline(str,length);
ReplaceBlank(str,length);
return 0;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  字符串 空格 替换