空格替换

题目:请实现一个函数,把字符串中的每个空格替换成“%20”。例如:输入“We are happy”,输出为“We%20are%20happy”.

在做题之前,我们先做一点小小的知识铺垫,每一件事情的产生都有它的原因,就好像空格替换的产生!之所以有空格替换,是因为在网络编程中,若URL参数中有特殊的字符,例如空格、‘#’等等,可能会导致服务器无法获得正确的参数。只有将这些特殊字符转换成服务器可以识别的字符,才能进行后续的工作。

转换规则为:在%后面跟上ASCII的两位十六进制表示。例如:空格的ASCII码是32,即十六进制的0x20;'#'的ASCII码为35,即十六进制的0x23。

下面,我们以“We are happy”为例。

做题思路:

(1)判空;

(2)遍历该字符串,计算出该字符串的长度,以及空格的个数(其中包括结束标志‘\0’),例如“We are happy”有13个字符串,空格个数为2;

(3)判断我们重新定义的长度的字符串是否有越界现象;

(4)我们定义两个指针,pa和pb,其中pa指向原始字符串的末尾,pb指向被替换之后的字符串末尾,接着移动pa,将pa指向的字符串复制到pb的位置,pb也往前移动一个字符的位置,当遇到空格时,将pa向前移动一个字符的位置,在pb之前插入字符串“%20”,同时将pb向前移动三个位置。重复此操作,直到pa等于pb时停止此操作。

上述过程中的第四部主要步骤,如下图:


我们用两种不同的接口实现以下代码

如下:

void ReplaceBlank(char string[], int length)
{
	//判空
	if (string == NULL&&length <= 0)
		return;

	//遍历字符串的长度,并且计算出空格的个数
	int orgLength = 0;//原来的字符串长度
	int blank = 0;//空格个数
	int i = 0;
	if (string[i]!= '\0')
	{
		++orgLength;
		if (string[i] == ' ')
		{
			++blank;
		}
		++i;
	}

	//计算替换之后的字符串长度,并进行越界处理
	int newLength = orgLength + blank * 2;//一个空格要被替换成3个字符,空格本身占一个位置,这里只需要格子数*2
	if (newLength > length)//注意这里的length,不只是上面的原字符串,它相当于该字符串的最大存储空间
		return;

	//遇到空格进行替换
	int indexorg = orgLength;
	int indexnew = newLength;
	while (indexorg >= 0 && indexnew > indexorg)//当原始字符串不为空并且新的字符串大于原来的字符串时
	{
		if (string[indexorg] == ' ')
		{
			//新的串连续向前走三步
			string[indexnew--] = '0';
			string[indexnew--] = '2';
			string[indexnew--] = '%';
		}
		else
		{
			string[indexnew--] = string[indexorg];
		}

		--indexorg;
	}
}
void replaceSpace(char *str, int length)
{
	//判空
	if (str == NULL || length <= 0)
		return;

	//求字符串长度及空格个数
	int orgLength = 0;
	int Blank = 0;
	//int i = 0;
	while (*str != '\0')
	{
		++orgLength;
		if (*str == ' ')
		{
			++Blank;
		}
	}

	//求新字符串长度,越界处理
	int newLength = orgLength + Blank * 2;
	if (newLength > length)
		return;

	//空格替换
	char* pa = str + orgLength;
	char* pb = str + newLength;
	while (pa >= NULL && pb > pa)
	{
		if (*pa == ' ')
		{
			*pb-- = '0';
			*pb-- = '2';
			*pb-- = '%';
		}
		else
		{
			*pb-- = *pa;
		}

		--pa;
	}
}




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值