《剑指》5.替换空格

题目:

  请实现一个函数,把字符串中的每个空格替换成“%20”。例如,输入“We are happy.”,则输出“We%20are%20happy.”

我的思路:

  有两种替换方式,第一种是在原有的字符串上进行替换,第二种是新建一个字符串完成操作。先考虑第一种方式,若从头往后开始替换,则会有数字重复被后移,所以可以从后往前开始替换,但是问题在于原有字符串的空间够不够用,如果不够用则还是要使用第二种方法进行操作。所以我最后还是使用了第二种方法,但是需要注意,如果内存空间够的话,使用第一种方法不需要新的内存空间作为代价,如果清楚内存空间足够的话,还是使用第一种办法好。

我的代码:

#include <iostream>
int StrCopy(char* str,int length,char* copy);

int main()
{
    char str[] = "   ";
    int i = 0;          //原数组的下标
    int j = 0;          //新数组的下标
    int spaceNum = 0;   //原数组中空格的个数
    int length = 0;     //原数组长度
    int lengthNew = 0;  //新数组长度
    char replaceStr[] = "%20";
    char* strNew = NULL;

    if (str != NULL)
    {
        while (str[i] != '\0')
        {
            if (str[i] == ' ')
                spaceNum++;     //获取空格长度

            i++;    //获取长度
        }
        length = i;
        lengthNew = i + spaceNum * 2 + 1;   //注意字符串的结尾有一个字节的结束符'\0'
        strNew = (char*)malloc(lengthNew * sizeof(char));
    }
    else
    {
        printf("字符串为空");
        return 0;
    }
        
    i = 0; j = 0;
    while (str[i] != '\0')
    {
        if (str[i] == ' ')
        {
            StrCopy(strNew, j, replaceStr);
            i++;
            j += 3;
        }
        else
        {
            strNew[j] = str[i];
            j++; i++;
        }
    }
    strNew[j] = '\0';
    printf("%s", strNew);
    return 0;
}

int StrCopy(char* str, int length, char* copy)
{
    if (str == NULL || copy == NULL || length < 0)
        return false;
    int i = 0;
    while (copy[i] != '\0')
    {
        if (str[length + i] != NULL)
        {
            str[length + i] = copy[i];
            i++;
        }
        else
            return false;
    }
    return true;
}

编写了StrCopy函数,便于代码复用。

遇到的问题:

问题:“%s”打印出来的新数组存在乱码
解决:忽略了字符串需要以’\0’结尾

总结:

  在合并两个数组时,如果从前往后复制每个数字则需要移动数字多次,那么可以考虑从前往后复制,这样能减少移动的次数,从而提高效率。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值