将string字符串中的空格替换

本文介绍了在网络编程中处理URL参数包含空格的情况,提出了两种解决方案:一是利用string类的replace函数直接替换;二是通过从后向前遍历字符串并替换空格的方法。这两种方法各有优劣,前者简单但需熟悉string类接口,后者虽然复杂些,但可以有效减少字符搬运工作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在网络编程中,如果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;
}

运行结果:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值