题目描述:请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
思路:
方法一:开辟一个新的数组来存放新的字符串
代码:
#include <stdio.h>
#include <assert.h>
char newStr[100] = { 0 };
char* NewStr(char* str)
{
int i = 0;
assert(str);
while (*str != '\0')
{
if (*str != ' ')
{
newStr[i++] = *str;
}
else
{
newStr[i++] = '%';
newStr[i++] = '2';
newStr[i++] = '0';
}
str++;
}
newStr[i] = '\0';
return newStr;
}
int main()
{
char str[30] = "We Are Happy";
char* newStr = NULL;
printf("%s\n", str);
newStr = NewStr(str);
printf("%s\n", newStr);
return 0;
}
方法二:在原先的字符串上操作,并且保证原字符串有足够长的空间来存放替换后的字符串
从后向前进行替换,有两个指针。一个指向计算好的字符串的尾端,另一个指向原先的字符串的尾端,
需要计算原先字符串有多少个空格
代码:
#include <stdio.h>
#incldue <assert.h>
#incldue <string.h>
char* NewStr(char* str)
{
int count = 0;
assert(str);
//计算原先字符串有多少个空格
char* tmp = str;
while (*tmp != '\0')
{
if (*tmp == ' ')
{
count++;
}
tmp++;
}
//给出两个指针,从后向前依次走
char* ps1 = NULL;
char* ps2 = NULL;
//计算长度
ps1 = str + (strlen(str) - 1);
ps2 = str + ((strlen(str) - count) + (count * 3) - 1);
//对于字符串一次排序
while (ps1 != str)
{
if (*ps1 != ' ')
{
*(ps2--) = *ps1;
}
else
{
*(ps2--) = '0';
*(ps2--) = '2';
*(ps2--) = '%';
}
ps1--;
}
str = ps2;
return str;
}
int main()
{
char str[30] = "We Are Happy";
char* newStr = NULL;
printf("%s\n", str);
newStr = NewStr(str);
printf("%s\n", newStr);
return 0;
}