字符串--1-空格替换

题目:请实现一个函数,将一个字符串中的空格替换成“%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类型。



猜你喜欢

转载自blog.csdn.net/ax_hacker/article/details/80835289