题目:请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
#include <iostream>
using namespace std;
class Solution
{
public:
void ReplaceBlank(char *str)
{
if (str == NULL)
return;
//统计空格数量
int count_blank = 0;
int i = 0;
while (str[i] != '\0')
{
if (str[i] == ' ')
count_blank++;
i++;
}
int orig_len = i;
int new_len = orig_len + count_blank * 2;
//orig_len和new_len分别从最后往前同时扫描,
//origin_len遇到空格,则new_len替换成%20
//str[new_len] = '\0';
//while (orig_len >= 0 && orig_len < new_len)
//{
// if (str[--orig_len] == ' ')
// {
// str[--new_len] = '0';
// str[--new_len] = '2';
// str[--new_len] = '%';
// }
// else
// str[--new_len] = str[orig_len];
//}
while (orig_len >= 0 && orig_len < new_len)
{
if (str[orig_len] == ' ') //切记字符比较 这里是 == 而不是 = (赋值)
{
str[new_len--] = '0';
str[new_len--] = '2';
str[new_len] = '%';
}
else
str[new_len] = str[orig_len];
--orig_len;
--new_len;
}
i = 0;
while (str[i] != '\0')
{
cout << str[i];
i++;
}
cout << endl;
}
};
int main()
{
Solution s;
string s1 = "hello";
s1[3] = 'o'; //可以
//s1[16] = '0'; //这里就不可以了,就会越界
cout << s1.capacity(); //15 这里vs2015 string类型分配15个空间,然后是31个空间,依次类推
char str[] = "hello wor ld ";
//str[5] = '0'; //可以
//char *s2 = "hell0";
//s2[2] = '0'; //可以,不能更改,因为其存在.rdata区
s.ReplaceBlank(str);
system("pause");
return 0;
}
这里要注意
char *str char str[] string str 三者之间的区别
char* str = "resource";
str[6] = 'k'; //这句报内存写入错误
*(str+6) = 'k'; //这样写同样报错
但是这样就没问题:
char* str = new char[12];
strcpy(str, "resource");
str[6] = k; //没问题
*(str+6) = 'k'; //没问题
这样也没问题:
char str[] = "resource";
str[6] = 'k';
*(str+6) = 'k';
原因:内存分配问题:
1、对于 char *str = "resource";
char *str = "resource"; <==> const char *m = "resource";//用const修饰的指针表示指针所指的内容不可修改
把"resource"的值----也就是字符串常量字面值,也就是"resource"的地址,准确来说是起始地址----赋给字符指针 str,Linux下,"resource"字符串常量是存放于只读数据区(.rdata)的。
2、对于 char str[] = "resource";
str[]是一个字符数组,编译器首先在栈中分配一定的连续空间用于存放“resource”中的字符以及结尾符,然后把字符串常量的内容,也就是 "resource"中的各个字符和结尾符复制到这个栈中的连续空间中。
3、
string s1 = "hello";
s1[3] = 'o'; //可以
//s1[16] = '0'; //这里就不可以了,就会越界
cout << s1.capacity(); //15 这里vs2015 string类型分配15个空间,然后是31个空间,依次类推
所以这个代码不能用string类型。