替换字符串中的所有空格

要替换一个字符串中的所有空格,一种想法是开辟一个新的字符数组,然后对字符串进行遍历,若遇到普通字符,则将字符拷贝到新数组中,若遇到空格,则直接跳过或进行替换。这种方法需要使用额外的空间。

如果已知原字符串中有足够的空间容纳替换,且不允许使用额外的数组空间,则可以先遍历一遍字符串,统计空格总数,由此可以计算出替换后的字符串新长度,然后用一个指针指向新的字符串尾部,然后从尾部拷贝字符串,若遇到空格,则进行相应替换,如果两个指针相遇,则说明替换结束。

以下例子将空格替换为三个下划线:

#include <stdio.h>
#include <iostream>
#include <string.h>

using namespace std;

void replaceSpace(char str[])
{
    int len = strlen(str);
    int spaceCnt = 0;
    for(int i=0; i<len; i++)               //统计字符串中的空格数
    {
        if(str[i] == ' ')
            spaceCnt++;
    }
    char *pEnd = str+len;                  //计算原来的字符串尾部
    char *pNewEnd = str+len+spaceCnt*2+1;  //计算新的字符串尾部,包含'\0'
    *pNewEnd-- = '\0';
    while(pNewEnd > pEnd)                  //如果二者相遇,则说明已经完全替换完毕
    {
        if(*pEnd == ' ')
        {
            *pNewEnd-- = '_';
            *pNewEnd-- = '_';
            *pNewEnd-- = '_';
            *pEnd--;
        }
        else
        {
            *pNewEnd-- = *pEnd--;
        }
    }
}

/*不允许开辟新的存储空间,假设原空间足够大*/
/*要求0(n)时间复杂度*/
int main()
{
    char str[256] = " helloworld  nihao my name is jakiechen ";
    replaceSpace(str);
    cout<<str<<endl;

    getchar();
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值