题目描述
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
大致思路
- 首先,想到的是一个个遍历,遇到空格就存 “%20” ,但是这样会覆盖后面的数据。
- 为了解决上述问题,需要一个中间的量保存一下,这里我想到了字符串。最后再将字符串赋值给原字符指针。
- 如果不允许中间量的话,那么在原数据基础上操作,那么可以考虑先把所有空格的数量统计出来,然后在原来长度的基础上再加上 2 倍空格数的长度(原本空格占一位)。最后从原数据的最末开始写,遇到空格就转换一下。
代码
方案一:
void replaceSpace(char *str, int length) {
string str_s = "";
for (int i = 0; i <= length; ++i) {
if (str[i] == ' ') {
str_s += "%20";
}
else{
str_s += str[i];
}
}
for (int i = 0; i < str_s.length(); i++){
str[i] = str_s.c_str()[i];
}
}
方案二:
void replaceSpace(char *str, int length) {
int num = 0;
for (int i = 0; i < length; ++i) {
if (str[i] == ' ')
++num;
}
for (int i = length - 1; i >= 0 && num > 0; --i) {
if (str[i] == ' ') {
str[i + 2 * num] = '0';
str[i + 2 * num - 1] = '2';
str[i + 2 * num - 2] = '\%';
--num;
}
else
str[i + 2 * num] = str[i];
}
}
结论
思路倒是不难,主要是写的过程中注意一些细节,比如用 string 赋值到原字符指针时,原本想直接把 string 里的字符数组的首地址赋值过去的,但是发现这是指针,不是指针引用不能改变原有指针的地址,最后又想到字符串操作的 strcpy, snprintf 等直接赋值,但是事实发现有点麻烦,各种安全函数替换。放弃了,还是自己手动一个个赋值最方便,毕竟这题目根本不考虑安全性问题,在原有基础上直接在后面加长度,能安全?方案二的话除了被扩充长度时空格 2 倍那里没注意到,调试的时候发现数据不对才想到,忘记算上原本空格长度了,-_-||