一 问题描述
实现函数,把字符串中的空格替换为"%20"
例如:把字符串"We are happy“中的空格全都替换为”%20",替换之后字符串就变为了"We%20are%20happy"
二 解题思路
① 利用两个数组实现
对该字符串进行遍历,一个字符一个字符往另外一个数组里面放,如果遇到空格就放入%20.
注意:
当放完所有的字符后,记得加上字符结束标志‘\0'
要写成if else的结构,否则会多放入一个‘ ’
缺点:另外开辟了一个一块空间,会造成空间的浪费
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
#include
int main()
{
char str[100] = "I LOVE STUDY!";
char space[100] = { 0 };
int len =(int)strlen(str);
int i = 0;
int j = 0;
for (i = 0; str[i] != '\0'; i++)
{
if (str[i] != ' ')
{
space[j] = str[i];
j++;
}
else
{
space[j++] = '%';
space[j++] = '2';
space[j++] = '0';
}
}
space[j] = '\0';
printf("%s", space);
return 0;
}
② 从前往后移动数组
从前往后对数组进行遍历,如果碰到空格,之后的所有元素都往后移动两个单位。
注意:由于会往后移动数组,因此数组的长度一直在变化。
所以每次循环都需要重新计算长度。
缺点:效率低。
每次遇到一个空格都需要往后移动
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
#include
int main()
{
char str[100] = "I LOVE STUDY";
int i = 0;
int j = 0;
for (i = 0; str[i] != '\0'; i++)
{
if (isspace(str[i]))
{
int len = strlen(str);
for (; len > i; len--)
{
str[len + 2] = str[len];
}
str[i] = '%';
str[i + 1] = '2';
str[i + 2] = '0';
}
}
printf("%s", str);
return 0;
}
③ 首先记录空格的数量,然后利用一个指针扩大数组2*空格数,指向扩大后末尾的位置,另外一个指针指向字符串的末尾。
从后往前放入。
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
#include
int main()
{
char str[100] = "WE ARE HAPPY!";
int len =(int)strlen(str);
int space = 0;
int i = 0;
char* end1 = str + len-1;
for (i = 0; str[i]; i++)
{
if (isspace(str[i]))
{
space++;//算出有多少个空格
}
}
char* end2 = str + len -1+space * 2;
while (end1 != end2)
{
if (isspace(*end1))
{
*end2-- = '0';
*end2-- = '2';
*end2-- = '%';
end1--;
}
else
{
*end2 = *end1;
end2--;
end1--;
}
}
printf("%s", str);
return 0;
}
三 比较推荐第三种
效率比较高,也没有造成空间浪费。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)