char str[100] = " hello world ";
我写上述代码的含义是,我们是在已分配足够空间的字符串的基础上开始空格的替换的,也即不存在索引越界、再分配内存的问题。
替换的顺序有二:
(1)从左到右
每发现一个空格,后面所有的元素退两格,也即从左到右无法一步实现将后面的单词出现在该出现的位置。
(2)从右到左
每发现一个空格,最后的一个单词退到合适的问题,可以一步实现最右的单词出现在该出现的位置。
显然出于效率的考虑,从右向左替换是更为合理的。
void ReplaceBlank(char str[], int len) // len 仅仅用来标识合法区间
{
if (str == NULL || len <= 0)
return ;
int originLen = 0;
int numOfBlank = 0;
while (str[originLen] != '\0')
{
if (str[originLen] == ' ')
++numOfBlank;
++originLen;
}
int newLen = originLen + numOfBlank * 2;
int p1 = originLen, p2 = newLen;
while (p1 >= 0 && p2 > p1)
{
if (str[p1] == ' ')
{
str[p2--] = '0';
str[p2--] = '2';
str[p2--] = '%';
}
else
{
str[p2--] = str[p1];
}
--p1;
}
}