在之前这篇博客中有提到过,在用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; }