要替换一个字符串中的所有空格,一种想法是开辟一个新的字符数组,然后对字符串进行遍历,若遇到普通字符,则将字符拷贝到新数组中,若遇到空格,则直接跳过或进行替换。这种方法需要使用额外的空间。
如果已知原字符串中有足够的空间容纳替换,且不允许使用额外的数组空间,则可以先遍历一遍字符串,统计空格总数,由此可以计算出替换后的字符串新长度,然后用一个指针指向新的字符串尾部,然后从尾部拷贝字符串,若遇到空格,则进行相应替换,如果两个指针相遇,则说明替换结束。
以下例子将空格替换为三个下划线:
#include <stdio.h>
#include <iostream>
#include <string.h>
using namespace std;
void replaceSpace(char str[])
{
int len = strlen(str);
int spaceCnt = 0;
for(int i=0; i<len; i++) //统计字符串中的空格数
{
if(str[i] == ' ')
spaceCnt++;
}
char *pEnd = str+len; //计算原来的字符串尾部
char *pNewEnd = str+len+spaceCnt*2+1; //计算新的字符串尾部,包含'\0'
*pNewEnd-- = '\0';
while(pNewEnd > pEnd) //如果二者相遇,则说明已经完全替换完毕
{
if(*pEnd == ' ')
{
*pNewEnd-- = '_';
*pNewEnd-- = '_';
*pNewEnd-- = '_';
*pEnd--;
}
else
{
*pNewEnd-- = *pEnd--;
}
}
}
/*不允许开辟新的存储空间,假设原空间足够大*/
/*要求0(n)时间复杂度*/
int main()
{
char str[256] = " helloworld nihao my name is jakiechen ";
replaceSpace(str);
cout<<str<<endl;
getchar();
return 0;
}