在"we are happy"这个字符串中,将所有的空格替换成字符串%20。
分析:当看到这个题目时,我们就会想着遍历字符串嘛,遇到空格替换成%20,可是空格只有一个字节,%20是3
个字节,明显是不够的,所以我们遇到把字符串整体后移(字符串只能存放在数组中),这样,空格越多,后边的字
符移动的次数也越多。(记住:移动的时候一定要移动\0)这样,如果我们一次移动到位,这样是不是好一点呢??
我们将后边也就是最后一个字符一次移动到位,(2个空格,移动4位)。然后从后向前依次改写就好(遇到空格就改
成%20)否则,直接复制。看下边的代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<assert.h>
void fillblack(char *arr)
{
assert(arr);
int len = strlen(arr);
int blacks = 0;
char *oldEnd = arr + len;
char *newEnd = arr + len ;
while (*arr++)
{
if (*arr == ' ')
blacks++;
}
newEnd += 2 * blacks;
while (oldEnd <= newEnd)
{
if (*oldEnd != ' ')
{
*newEnd-- = *oldEnd--;
}
else
{
*newEnd-- = '0';
*newEnd-- = '2';
*newEnd-- = '%';
oldEnd--;
}
}
}
int main()
{
char arr[20] = "we are happy";
fillblack(arr);
printf("%s",arr);
system("pause");
return 0;
}
复制操作循环结束的条件:当新串的指针与旧串的指针指向相等时(也就是复制到字符串的第一个单词时)就不需要
复制了,当然你复制也没关系,只是无用功罢了。
这个题目,同学也有整理过,他给出了另外一种方法,我觉得比较好:主函数另外再给出一个数组作为实参传给操作
函数,这个数组存放改后的字符串。具体操作:从前向后,当遇到空格时,写成%20,其他的直接复制就好。这
里就不给出代码,有兴趣的自己实现。
其实%20也不是随机给的,你可以在浏览器下看看就知道了。
以上如有不合理,请指出~~