题目:请实现一个函数,把字符串中的每个空格替换成“%20”。例如,输入“We are happy.”,则输入“We%20are%20happy.”。
由于空格是一个字符,而%20是三个字符‘%’‘2’‘0’。要完成这个替换,首先必须要保证原字符串的长度够长,否则就会造成内容覆盖的问题。接下来我们的思路就是遍历,然后遇到空格进行替换。但是我们想想,每次替换都会面临着一个移动的过程。将空格后的字符串向后移动两个位置,接着,再进行替换。那么完全替换结束后,这个移动的过程是非常多次的,而且有很多字符移动了好几遍。那么如何减少移动次数呢?
我们可以在移动之前先遍历字符串。找出字符串的空格个数。然后乘以二加上之前的字符串长度。这个就是替换过后的字符串长度。接下来,我们从后往前移动,由于是从后往前移动,所以这个时候不牵扯到覆盖问题。
这里我们以“We are”举例。
这里首先两个指针,当p2遇到空格时,p2++,此时p1继续赋值为‘0’‘2’‘%’然后p1++。一直持续到p1 == p2,替换完毕。
#include <stdio.h>
void ChangeSpace(char* str, int sz)
{
if(str == NULL || sz <= 0) {
return;
}
int len = 0;
int space = 0;
int i = 0;
while(str[i] != '\0') {
++len;
if(str[i] == ' ') {
++space;
}
++i;
}
int newlen = len + space*2;
if(newlen > sz) {
return;
}
int index_1 = len;
int index_2 = newlen;
while(index_1 >= 0 && index_2 > index_1) {
if(str[index_1] == ' ') {
str[index_2--] = '0';
str[index_2--] = '2';
str[index_2--] = '%';
} else {
str[index_2--] = str[index_1];
}
--index_1;
}
}
void PrintStr(char* str, int sz)
{
if(str == NULL) {
return;
}
int i = 0;
for(; i < sz; ++i) {
if(str[i] == '\0') {
break;
}
printf("%c",str[i]);
}
printf("\n");
}
int main()
{
char str[64] = "We are happy.";
int sz = sizeof(str)/sizeof(str[0]);
ChangeSpace(str, sz);
PrintStr(str, sz);
return 0;
}
欢迎大家共同讨论,如有错误及时联系作者指出,并改正。谢谢大家!