题目:请实现一个函数,把字符串中的每个空格替换成“%20”。例如:输入“We are happy”,输出为“We%20are%20happy”.
在做题之前,我们先做一点小小的知识铺垫,每一件事情的产生都有它的原因,就好像空格替换的产生!之所以有空格替换,是因为在网络编程中,若URL参数中有特殊的字符,例如空格、‘#’等等,可能会导致服务器无法获得正确的参数。只有将这些特殊字符转换成服务器可以识别的字符,才能进行后续的工作。
转换规则为:在%后面跟上ASCII的两位十六进制表示。例如:空格的ASCII码是32,即十六进制的0x20;'#'的ASCII码为35,即十六进制的0x23。
下面,我们以“We are happy”为例。
做题思路:
(1)判空;
(2)遍历该字符串,计算出该字符串的长度,以及空格的个数(其中包括结束标志‘\0’),例如“We are happy”有13个字符串,空格个数为2;
(3)判断我们重新定义的长度的字符串是否有越界现象;
(4)我们定义两个指针,pa和pb,其中pa指向原始字符串的末尾,pb指向被替换之后的字符串末尾,接着移动pa,将pa指向的字符串复制到pb的位置,pb也往前移动一个字符的位置,当遇到空格时,将pa向前移动一个字符的位置,在pb之前插入字符串“%20”,同时将pb向前移动三个位置。重复此操作,直到pa等于pb时停止此操作。
上述过程中的第四部主要步骤,如下图:
我们用两种不同的接口实现以下代码
如下:
void ReplaceBlank(char string[], int length)
{
//判空
if (string == NULL&&length <= 0)
return;
//遍历字符串的长度,并且计算出空格的个数
int orgLength = 0;//原来的字符串长度
int blank = 0;//空格个数
int i = 0;
if (string[i]!= '\0')
{
++orgLength;
if (string[i] == ' ')
{
++blank;
}
++i;
}
//计算替换之后的字符串长度,并进行越界处理
int newLength = orgLength + blank * 2;//一个空格要被替换成3个字符,空格本身占一个位置,这里只需要格子数*2
if (newLength > length)//注意这里的length,不只是上面的原字符串,它相当于该字符串的最大存储空间
return;
//遇到空格进行替换
int indexorg = orgLength;
int indexnew = newLength;
while (indexorg >= 0 && indexnew > indexorg)//当原始字符串不为空并且新的字符串大于原来的字符串时
{
if (string[indexorg] == ' ')
{
//新的串连续向前走三步
string[indexnew--] = '0';
string[indexnew--] = '2';
string[indexnew--] = '%';
}
else
{
string[indexnew--] = string[indexorg];
}
--indexorg;
}
}
void replaceSpace(char *str, int length)
{
//判空
if (str == NULL || length <= 0)
return;
//求字符串长度及空格个数
int orgLength = 0;
int Blank = 0;
//int i = 0;
while (*str != '\0')
{
++orgLength;
if (*str == ' ')
{
++Blank;
}
}
//求新字符串长度,越界处理
int newLength = orgLength + Blank * 2;
if (newLength > length)
return;
//空格替换
char* pa = str + orgLength;
char* pb = str + newLength;
while (pa >= NULL && pb > pa)
{
if (*pa == ' ')
{
*pb-- = '0';
*pb-- = '2';
*pb-- = '%';
}
else
{
*pb-- = *pa;
}
--pa;
}
}