在网络编程中,如果URL参数中含有特殊的字符,比如空格,“+”等,往往会被当做特殊意义理解,所以这些特殊字符不能随便使用,但是如果URL参数中确实需要这样的字符,那么就需要对这些字符进行转义,方可继续执行。
例如:将字符串中的每个空格替换成“%20”;“we are happy” 经过替换后变成了“we%20are%20happy”.
下面用两种方法解决这个问题:
1、直接调用string类中的replace函数
在string类中可以直接调用replace函数进行字符串的替换,
**原型:**string& replace (size_t pos, size_t len, const string& str);
说明:删除源字符串从下标为pos处开始的len个字符,然后在pos处插入string型字符串str。
具体代码实现如下:
string replaceSpace(string iniString, int length) {
if (length <= 0)//字符串长度为空时,不用判断
return "";
string tag = " ";//为了后面计算长度---参数
for (size_t i = 0; i < iniString.size(); i++){
if (iniString[i] == ' '){
iniString.replace(i, tag.size(), "%20");
}
}
return iniString;
}
这块代码实现起来比较简单,但是需要大家对string类的一些接口函数要有比较清晰的了解。
2、自己实现空格替换部分的代码
(1)第一种方法
我们能想到的最直观的做法就是从头扫描字符串,每次碰到空格字符的时候就进行替换。在这道题中,由于空格是一个字节,“%20”是三个字节,所以在进行空格替换的时候,就需要将该空格之后的字符全部后移两个字节,否则原来的字符串将不完整了。
这种做法完全可以成功实现空格替换,但是缺点就是时间复杂度比较高:假设字符串长度为n,对每个空格字符,每次都需要移动后面O(n)个字符,因此对含有O(n)个空格字符的字符串而言,总的时间复杂度是O(n^2)。
(2)第二种做法
为了降低字符的搬移工作量,我们可以从后往前遍历字符串进行替换空格,实现该方法主要有以下几个步骤:
(1)遍历字符串,记录原始字符串的长度,以及空格字符的总长度SpaceNum
(2)设置新的字符串长度newCapacity=length+2*SpaceNum;
(3)定义原始字符串下标oldindex和新字符串的下标newindex,并从后向前遍历
进行空格替换。
具体代码实现部分:
string replaceSpace1(string iniString, int length)
{
if (length <= 0)
return NULL;
size_t SpaceNum = 0;//空格数目
size_t oldlength = 0;//原始字符串长度
size_t i = 0;
while (iniString[i] != '\0')
{
oldlength++;
if (iniString[i] == ' ')
SpaceNum++;
i++;
}
size_t newCapacity = length + 2 * SpaceNum;//新字符串的长度
iniString.resize(newCapacity);
size_t oldindex = oldlength;
size_t newindex = newCapacity;
//空格替换
while (oldindex >= 0 && newindex > oldindex)
{
if (iniString[oldindex] == ' ')
{
iniString[newindex--] = '0';
iniString[newindex--] = '2';
iniString[newindex--] = '%';
}
else
{
iniString[newindex--] = iniString[oldindex];
}
--oldindex;
}
return iniString;
}
运行结果: