4+替换字符串中的所有空格

title:
一、将字符串中的所有空格用%20替换
二、扩展:将两个有序的数组连接成一个有序数组,第一个数组足够大


thought:
1、原串的内存足够大,在原串中实现替换
2、可开辟新空间,将原串复制到新串的过程中把空格替换


realize:
一、
实现第一个想法:
1、统计原串s中(长度len)空格的个数cnt(cnt为0表示无空格)
2、则新串的长度(newLen)为len+cnt*2+1(1代表结束符)
3、指针p,q分别指向原串和新串的尾部,
   *p==' ',用‘%20’替换后复制到q
   *p!=' ',将此字符复制到q;
结束条件是新串指针q与原串指针p相遇(p==q)


实现第二个想法(此方法较简单):
1、开辟新内存s1(内存足够存储替换后的字符串)
2、依次将s中的字符复制到s1中,遇到空格就用‘%20’替换


二、
利用替换空格的第一个思想:
1、计算A2的长度len,以此确定A1的有效长度;
2、从两个数组A1、A2的最后一位开始比较,较大的移至A1的有效长度内的尾部;
3、两个数组依次左移逐个比较,最终移至数组的首位,比较结束,移位也结束。


注:
在从键盘输入带空格的字符串时不能直接用cin>>s
因为cin遇空格结束,可以用cin.getling(s,size_t)

或者getline(cin,s);


说明:这里对数组的合并只在上面提示了思路,还没有用代码实现

#include <iostream>
#include <string>
using namespace std;
void replace_space1(char *);  //在原串中用%20替换空格(原串内存足够大)
void replace_space2(char *);  //开辟新内存用%20替换空格
void array_combin(int* ,int* );//将两个有序数组组合在一起,形成一个新数组,仍保持有序


void replace_space1(char *str)
{
	if(str == NULL)
		return;
	int cntSpace = 0,Len = strlen(str);   //Len不包括结束符
	char *p = str;
	while(*p != '\0')
	{
		if(*p++ == ' ')
			cntSpace++;
	}
	if(0 == cntSpace)
	{
		cout << "字符串中没有空格!" << endl;
		return;
	}
	int newLen = Len+cntSpace*2+1;     //+1代表将结束符计入总长
	char *End = str+Len;              //此时End指向的是结束符‘\0’
	char *newEnd = str+newLen-1;   
	//cout << *(str+Len-1) << endl;  //此时输出的是str的最后一个字符(非结束符)
	//cout << "Len=" << Len << endl;
	//cout << "newLen=" << newLen << endl;
	while(End != newEnd)
	{
		if(' ' == *End)
		{
			*(newEnd--) = '0';
			*(newEnd--) = '2';
			*(newEnd--) = '%';
			End--;
		}
		else
		{
			*newEnd-- = *End--;
		}
	}
	cout << "空格被替换后得到的新字符串:" << endl;
	cout << str << endl;
}

void replace_space2(char *str)
{
	if(str == NULL)
		return;
	int cntSpace = 0,Len = strlen(str);   //Len不包括结束符
	char *p = str;
	while(*p != '\0')
	{
		if(*p++ == ' ')
			cntSpace++;
	}
	if(0 == cntSpace)
	{
		cout << "字符串中没有空格!" << endl;
		return;
	}
	int newLen = Len+cntSpace*2+1;  //+1代表将结束符计入总长
	char *s1 = new char[newLen];
	p = str;
	char *q = s1;
	while (*p != '\0')
	{
		if(' ' == *p)
		{
			*q++ = '%';
			*q++ = '2';
			*q++ = '0';
			p++;
		}
		else
		  *q++ = *p++;
	}
	*q = '\0';
	cout <<"替换空格后的新字符串:" << endl;
	cout << s1 << endl;
}


int main()
{
	char *s = new char[100];
	cout << "输入一个字符串:" << endl;
	cin.getline(s,100); //直接用cin >> s不能输入带空格的字符串
	//replace_space1(s);
	replace_space2(s);
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值