面试题4:替换字符串中的空格

本文介绍了一种高效的字符串处理算法,用于将字符串中的空格替换为%20,以适应URL编码规范。该算法通过从字符串末尾开始处理,仅需一次遍历即可完成所有替换操作,特别适用于含有多个空格的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.题目:实现一个函数,把字符串中的每个空格替换成%20,例如输入:We are happy!, 则被替换成We%20are%20happy!

在网络编程中,URL地址中常包含特殊的字符如空格等,为了便于服务器解析,将这些特殊的字符转换成服务器可以识别的字符。转换规则是在%后面加上ASCII码的两位的十六进制表示,空格的ASCII码为32,十六进制为0x20,则替换的结果就是%20.

分析:假设只是在源字符串上进行替换,并且保证输入的字符串的后面有足够的内存。如果按照常规的解法,从前到后遍历字符串,则每遇到一个空格,都会将字符串后面的部分向后移动两个位置,如果有多个空格的话,将会移动多次。可以考虑从后开始扫描空格的位置,可以只移动一次就将响应的字符移到最终的位置。可以先统计出空格的个数,则新串的长度为原串的长度加上空格的个数*2,然后从后开始扫描字符串,如果不是空格,则从后面一次复制字符,如果碰到空格,则填充响应的%20,并向前移动三个位置。整个过程可以方便的用指针来实现。如下图:



源码:

/*替换字符串中的空格*/
#include <iostream>
#include <string>
using namespace std;
#define MAXLENGTH 100

/*length 为字符数组string的总容量*/
void ReplaceBlank(char string[], int length)
{
	if (string == NULL && length <= 0)
		return;

	/*originalLength 为字符串string的实际长度*/
	int originalLength = 0;
	int numberOfBlank = 0;//空格的数量
	int i = 0;
	while (string[i] != '\0')
	{
		++originalLength;

		if (string[i] == ' ')
			++numberOfBlank;

		++i;
	}

	/*newLength 为把空格替换成'%20'之后的长度*/
	int newLength = originalLength + numberOfBlank * 2;
	if (newLength > length)
		return;

	int indexOfOriginal = originalLength;//指向原字符串的末尾
	int indexOfNew = newLength;//指向新串的末尾
	while (indexOfOriginal >= 0 && indexOfNew > indexOfOriginal)
	{
		if (string[indexOfOriginal] == ' ')//当遇到空格时,填充之后,应该前进3个位置
		{
			string[indexOfNew--] = '0';
			string[indexOfNew--] = '2';
			string[indexOfNew--] = '%';
		}
		else
		{
			string[indexOfNew--] = string[indexOfOriginal];
		}

		--indexOfOriginal;
	}
}


int main()
{
	char c[MAXLENGTH] = "We are happy!";
	cout << "原字符串为:" << c << endl;
	ReplaceBlank(c, MAXLENGTH);
	cout << "替换之后的结果为:" << c << endl;
	system("PAUSE");
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值