题目:
请实现一个函数,把字符串中的每个空格替换成“%20”。例如,输入“We are happy.”,则输出“We%20are%20happy.”
我的思路:
有两种替换方式,第一种是在原有的字符串上进行替换,第二种是新建一个字符串完成操作。先考虑第一种方式,若从头往后开始替换,则会有数字重复被后移,所以可以从后往前开始替换,但是问题在于原有字符串的空间够不够用,如果不够用则还是要使用第二种方法进行操作。所以我最后还是使用了第二种方法,但是需要注意,如果内存空间够的话,使用第一种方法不需要新的内存空间作为代价,如果清楚内存空间足够的话,还是使用第一种办法好。
我的代码:
#include <iostream>
int StrCopy(char* str,int length,char* copy);
int main()
{
char str[] = " ";
int i = 0; //原数组的下标
int j = 0; //新数组的下标
int spaceNum = 0; //原数组中空格的个数
int length = 0; //原数组长度
int lengthNew = 0; //新数组长度
char replaceStr[] = "%20";
char* strNew = NULL;
if (str != NULL)
{
while (str[i] != '\0')
{
if (str[i] == ' ')
spaceNum++; //获取空格长度
i++; //获取长度
}
length = i;
lengthNew = i + spaceNum * 2 + 1; //注意字符串的结尾有一个字节的结束符'\0'
strNew = (char*)malloc(lengthNew * sizeof(char));
}
else
{
printf("字符串为空");
return 0;
}
i = 0; j = 0;
while (str[i] != '\0')
{
if (str[i] == ' ')
{
StrCopy(strNew, j, replaceStr);
i++;
j += 3;
}
else
{
strNew[j] = str[i];
j++; i++;
}
}
strNew[j] = '\0';
printf("%s", strNew);
return 0;
}
int StrCopy(char* str, int length, char* copy)
{
if (str == NULL || copy == NULL || length < 0)
return false;
int i = 0;
while (copy[i] != '\0')
{
if (str[length + i] != NULL)
{
str[length + i] = copy[i];
i++;
}
else
return false;
}
return true;
}
编写了StrCopy函数,便于代码复用。
遇到的问题:
问题:“%s”打印出来的新数组存在乱码
解决:忽略了字符串需要以’\0’结尾
总结:
在合并两个数组时,如果从前往后复制每个数字则需要移动数字多次,那么可以考虑从前往后复制,这样能减少移动的次数,从而提高效率。