替换空格

题目:实现一个函数,把字符串的每个空格替换成“%20”。如"we are family.",输出为“we%20are%20family. 
(在原来的字符串上进行替换,并保证输入的字符串后面有足够多的空余内存。
1为何??
网络编程里,若URL参数中含特殊的字符,如空格,#等,会让服务器无法获取正确的参数值,则须将其转换成服务器可识别的字符,转换规则:‘%’+ASCII码的两位十六进制
     空格的ASCII码32,转换成16进制0x20
2实现
需要考虑时间的复杂度!!!以及覆盖问题
(1)若用直观的解法,从头到尾扫描字符串,每次碰到空格就替换,考虑覆盖问题,所以要把空格后面所有字符都后移两个字节。
若字符串长度为n,则时间复杂度为O(n^2)。
【2】从后往前进行替换。
(1)先遍历一遍字符串,统计字符串中空格的数目。
(2)计算替换空格后字符串的总长度
(3)从后面开始进行赋值与替换。
如何实现???
1定义两个指针,p1指向原字符串的末尾,p2指向替换后字符串的末尾
2然后向前移动p1,逐个将其指向的字符复制到p2指向的位置,直到碰到第一个空格。此时,将P1前移一格,,在p2前插入“%20”。此时p2需前移3个格,之后碰到后面的空格同上处理,直到p1和p2指向同一位置,表示所有空格替换完成。

代码的实现
#include <cstdio>
#include <cstring>
#include<iostream>
using namespace std;
void ReplaceBlank(char str[], int len)
{
     if (str == NULL && len <= 0)
     {
           return;
     }
     int firstLen = 0;//实际长度
     int countBlank = 0;//空格数
           int i = 0;
           while (str[i] != '\0')
           {
                ++firstLen;
                if (str[i] == ' ')
                {
                     ++countBlank;
                }
                ++i;
           }
           int newlen = firstLen + 2 * countBlank;
           if (newlen > len)
           {
                return;
           }
           int inFirst = firstLen;
           int inNew = newlen;
           while (inFirst >= 0 && inFirst < inNew)
           {
                if (str[inFirst] == ' ')
                {
                     str[inNew--] = '0';
                     str[inNew--] = '2';
                     str[inNew--] = '%';
                }
                else
                {
                     str[inNew--] = str[inFirst];
                }
                --inFirst;
           }
     
}
void main()
{
     const int len = 100;
     char str[len] = "we are family";
     ReplaceBlank(str, len);
     cout << str << endl;
}












评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值