题目:实现一个函数,要求吧字符串中的所有空格替换成“%20”。例如把“hello world" 变成 ”hello%20world"。
分析:我们可能会有三种方法:
(1).创建一个新的数组,让其遇到空格就变成“%20”,显然这种方法可以实现,但其也会浪费空间,所以这种方法也并不是很好。
(2).在原有的基础上进行替换,当然前提是数组空间是足够的,然后就要想是从前往后还是从后向前,如果是从前向后进行替换的换的话,那后面的字符肯定会被覆盖,所以只能从后向前进行替换,遇到空格就向后移动在进行替换。
(3)可以通过计算算出替换后数组的长度,即在原有的数组长度后面加上2*空格数,用下标标识出原数组和待插入的位置,然后从后向前处理,如果遇到空格直接替换成“%20”,如果没有的话就直接将前面的数搬到后面,直到原数组和待插入的下标重合。
相比之下(3)比(2)所需的时间更短,效率更高,因此我们应采用第三种方法
具体代码如下:
#include<stdio.h>
#include<assert.h>
#include<string.h>
#include<stdlib.h>
void change(char *p)
{
assert(p);
int newlen = 0;
int len = 0;
int count = 0;
int end = 0;
int newend = 0;
int i = 0;
len = strlen(p);
for (i = 0; i<=len; i++)
{
if (p[i] == ‘ ‘)
count++;
}
newlen = len + count * 2;
end = len;
newend = newlen;
while (end != newend)
{
if (p[end] == ‘ ‘)
{
p[newend--] = ‘0‘;
p[newend--] = ‘2‘;
p[newend--] = ‘%‘;
end--;
}
else
p[newend--] = p[end--];
}
}
int main()
{
char *a = (char*)malloc(sizeof(char)* 100);
assert(a);
gets_s(a,100);
change(a);
printf("%s\n",a);
free(a);
system("pause");
return 0;
}
运行结果: