题目
实现一个函数,把字符串中的每个空格替换成“%20”。
输入
There are no spaces.
输出
There%20are%20no%20spaces.
分析
这是道题挺简单的,写出来是为了强调思路,有时候正着不行就得倒着来~
首先,我们经常在网址中发现%20这样的字眼,这是因为在URL参数中含有特殊字符,如空格等,可能导致服务器无法获得正确的参数,所以要把特殊符号转换为服务器可识别的字符,转换规则是在%后面跟上ASCII码的两位十六进制的表示。空格的ASCII码是32,十六进制为0x20,所以被替换为%20。
其次,将长度为1的空格替换为长度为3的“%20”,字符串长度变长,而不是变短。
如果允许我们开辟一个新的数组来存放替换空格后的字符串,那么这道题目一般就不会被拿来考试了。所以,一般情况考察的是在原先的字符串上进行操作,保证原字符串有足够长的空间来存放替换后的字符串。
如果从前往后替换字符串,那么保存在空格后面的字符串肯定会被覆盖,那么就从后往前进行替换。
1)遍历原字符串,找出字符串的长度以及其中的空格数量
2)根据原字符串的长度和空格的数量我们可以求出最后新字符串的长度。
3)设置两个指针p1和p2分别指向原字符串和新字符串的末尾位置。
4)如果p1指向内容不为空格,那么将内容赋值给p2指向的位置,
5)如果p1指向为空格,那么从p2开始赋值“02%”
6)直到p1==p2时表明字符串中的所有空格都已经替换完毕。
代码
#include<iostream>
using namespace std;
//length为字符串总容量
void ReplaceSpace(char str[], int length)
{
if (str == nullptr || length <= 0)
return;
int OldLength = 0;
int BlankNum = 0;
for (int i = 0; str[i] != '\0'; i++)
{
++OldLength;
if (' ' == str[i])
{
BlankNum++;
}
}
int NewLength = OldLength + 2 * BlankNum;
if (NewLength > length)
return;
str[NewLength] = '\0';
int p1 = OldLength - 1, p2 = NewLength - 1;
while(p1 >= 0 && p2 > p1)
{
if (str[p1] == ' ')
{
str[p2--] = '0';
str[p2--] = '2';
str[p2--] = '%';
}
else
str[p2--] = str[p1];
p1--;
}
}
int main()
{
char str[50] = "There are no spaces";
cout << str << endl;
ReplaceSpace(str, 50);
cout << str << endl;
return 0;
}