题目:实现一个函数,把字符串的每个空格替换成“%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;
}