题目:请实现一个函数,把字符串中每个空格替换成"%20"。例如,输入"we are happy.",则输出"we%20are%20happy."。
自己写的:
#include<iostream.h>
#include<string.h>
void replaceblank(char *str)
{
if(str==NULL)
return;
int len=strlen(str)+1;
int newLen;//新字符串长度
int i,j;
int num=0;//空格数量
char *tempStr=NULL;
for(i=0;i<len;i++)
{
if(str[i]==' ')
num++;
}
if(num==0)
tempStr=str;
else
{
newLen=len+num*2;//问题出现的地方,标准newLen=len+num*2;
tempStr=new char[newLen];
for(i=0,j=0;i<len;i++)
{
if(str[i]!=' ')
tempStr[j++]=str[i];
else
{
tempStr[j++]='%';
tempStr[j++]='2';
tempStr[j++]='0';
}
}
}
cout<<tempStr<<endl;
}
int main()
{
char *str="we are happy.";//测试用例一
//char *str="we";//测试用例二
//char *str=" we";//测试用例三
//char *str="we ";//测试用例四
//char *str=NULL;
//char *str="";
//char *str=" ";
//char *str=" ";
replaceblank(str);
return 0;
}
我的思路是重新生成一个新的字符串数组,欢迎大家指正
书上给的解题思路是在原有的字符串上扩充:
剑指offer上给的答案:
//length为字符数组string的总容量
void replaceblank_answer(char string[],int length)
{
if(string==NULL||length<=0)
return;
//originalLength为字符串string的实际长度
int originalLength=0;
int numberOfBlank=0;
int i=0;
while(string[i]!='\0')
{
++originalLength;
if(string[i]==' ')
++numberOfBlank;
i++;
}
//newLength为把空格替换成'%20'之后的程度
int newLength=originalLength+2*numberOfBlank;
if(newLength>length)
return;
int indexOfOriginal=originalLength;
int indexOfNew=newLength;
while(indexOfOriginal>=0 && indexOfNew>indexOfOriginal)
{
if(string[indexOfOriginal]==' ')
{
string[indexOfNew--]='0';
string[indexOfNew--]='2';
string[indexOfNew--]='%';
}
else
{
string[indexOfNew--]=string[indexOfOriginal];
}
--indexOfOriginal;
}
}
但是运行在vc++6.0上总是报错,可能是编译器的问题
希望大家讨论下