题目描述:
请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
给定函数头:
void replaceSpace(char *str,int length)
题意分析:替换之后的字符串,其有效字符长度大于 原字符串。新字符串仍旧存放在指针str所指向的内存中,该内存的最大长度为 length.
解法:可以先遍历一遍字符串,统计出原字符串的长度oldlen,以及其中空格的个数count;则新字符串的长度newlen=oldlen+count*2;
接下来涉及到新字符串建立时 原字符串元素的复制,注意到新旧字符串共用同一内存空间。
方法一:如果按序号由小到大复制,则每遇到一个空格,其后的所有字符均要向后移动两个位置,为%20留出空间。
方法二:如果按序号由大到小复制,则每遇到一个空格,%20可以直接存放到当前位置,然后继续向前复制。
显然,方法二效率更高,实现也更简单。
本文采用方法二。
下面是代码:
#include<iostream>
using namespace std;
void replaceSpace(char *str, int length) {
//按照题意,length应该是str所指向内存中可存的最大字符数量。
int newlen = 1;//新字符串长度,包含结束标志'\0'
int oldlen = 1;//原字符串长度,包含结束标志'\0'
int count = 0;//数空格个数
int i = 0;
while (str[i] != '\0') {
if (str[i] == ' ') //如果遇到空格,count加一
count++;
oldlen++;//原字符串长度
i++;
}
newlen = oldlen + 2 * count;//新字符串长度
if (newlen>length)//如果新字符串长度大于限定长度,则退出程序
exit(1);
while (oldlen>0) {//从后往前复制
oldlen--;
newlen--;
if (str[oldlen] != ' ') { //非空格字符直接复制
str[newlen] = str[oldlen];
}
else {//空格字符从后往前依次用'0','2','%'替代
str[newlen--] = '0';
str[newlen--] = '2';
str[newlen] = '%';
}
}
}
int main()
{
int length = 20;
char str[20] = "We are happy";
replaceSpace(str, length);
printf("%s\n", str);
system("pause");
return 0;
}