在之前这篇博客中有提到过,在用URL来标识万维网上的特殊文档时,需要对一些用户输入的字符进行urlencode处理。因为URL中的一些字符已被特殊化对待,如?等在URL中表示着特殊的含义。当用户在搜索内容时也输入了?时,就会将其混淆,所以要对用户输入的这些字符进行urlencode处理。
在本问题中,就是实现将用户输入字符串中的空格字符进行urlencode处理,将其转化为%20。如将字符串“hello world”中的空格转化为%20,结果为:“hello%20world”。前提:源字符串有足够大的空间。
思路:
(1)首先遍历源字符串,统计源串中空格字符的个数。
(2)因为源串中的一个空格替换后变成了3个字符,所以重新计算替换后的字符串长度:源串长度加上空格个数乘2。
(3)将源串从最后一个字符(将\0也拷贝上)开始拷贝至新串的末尾,即从尾部开始拷贝,依次遍历两个字符串。如果在遍历源串的过程中遇到了空格,就将新串中的连续三个字符替换为%20.
根据上述思路,实现代码如下:
void Replacement(char* iniString, int length)
{
if (iniString == NULL || length <= 0)
{
//非法输入
return;
}
//首先统计字符串中的空格个数
int spacenum = 0;
int i = 0;
for (i = 0; i < length; i++)
{
if (iniString[i] == ' ')
{
spacenum++;
}
}
//将数组的长度替换为原字符串的长度加上空格的个数乘2
int newnum = length + spacenum * 2;
int index = newnum;//新串也从尾部开始遍历
//将字符串从尾部拷贝到新数组的尾部
for (i = length; i >= 0; i--)
{
//如果遇到空格则替换为%20
if (iniString[i] == ' ')
{
iniString[index--] = '0';
iniString[index--] = '2';
iniString[index--] = '%';
}
else
{
iniString[index--] = iniString[i];
}
}
return;
}