题目:请实现一个函数,把字符串中的每个空格替换成“%20”,例如输出“We are happy”,则输出“We%20are%20happy”.
//思路:如果直接替换,就有可能覆盖修改在字符串后面的内存。如果创建新的字符串并在新的字符串上做替换,我们就可以分配足够多的内存。
//对于任何一个函数,我们要做哪些基本的检测
//1.传入的参数有效性
//2.函数体边界的判断
//3.返回值正确返回
void ReplaceBlank(char str[], int length)
{
if (str == NULL||length<=0)
{
return;
}
//originalLength为字符串原始长度
int originalLength = 0;
int numberOfBlank = 0;
int i = 0;
while (str[i] != '\0')
{
if (str[i] == ' ')
{
++numberOfBlank;
}
++i;
++originalLength;
}
//newLength 为把空格替换为%20后字符串长度
int newLength = originalLength + 2 * numberOfBlank;
if (length < newLength)
{
return;
}
//从后往前拷,减少了挪动字符次数,因为后面都是放置好的元素
//需要两个指针,分别指向两个位置,若两个位置值相等,则拷贝结束
int indexOfOriginal = originalLength;//该指针指向的元素内容为'\0',因为字符串中字符的个数(不包含'\0')指向的'\0'
int indexOfNew = newLength;
//开始替换
while (indexOfOriginal < indexOfNew&&indexOfOriginal >= 0)
{
//从后往前拷,第一个
if (str[indexOfOriginal] == ' ')
{
str[indexOfNew--] = '0';
str[indexOfNew--] = '2';
str[indexOfNew--] = '%';
}
else
{
str[indexOfNew--] = str[indexOfOriginal];
}
--indexOfOriginal;
}
}