程序员面试笔记---替换空格

在网络编程中,如果URL参数中含有特殊字符,如空格、#等,可能导致服务器端无法获得正确的参数值。因此,需要将这些特殊符号转换为服务器可以识别的字符。
转换的规则:在%后面跟上ASCII码的两位十六进制的表示。如空格的ASCII码是32,即十六进制的0x20,因此空格被替换成“%20”.

问题:如何实现一个函数,把字符串中的每个空格替换成“%20”.例如:My name is Irene. 输出为My%20name%20is%20Irene...

做法:首先遍历一次字符串,统计出字符串中空格的总数,并计算出替换之后字符串的总长度。每替换一个空格,长度增加2,故替换之后字符串的长度等于原来的长度加上2*空格数目。在My name is Irene.中,字符串长度为18,替换之后的长度为24.
源代码编辑如下:亲测有效哦。。
#include<iostream>
#include<string>//不是<string.h>,带.h的是C语言中的头文件

void RepalceBlank(char Str[], int length);

using namespace std;

//strlen  计算字符串里面一共有多少个字符
//sizeof  计算字符串占的总内存空间

int main()
{
	char Str[100];
	//cin >> Str;//不能读取空格
	gets_s(Str);

	getline的用法
	/*string ssttr;
	getline(cin, ssttr);
	int length1 = sizeof(ssttr);*/
	
	int length = sizeof(Str);
	RepalceBlank(Str, length);//数组名称直接作为指针进行地址传递。
	cout << Str << endl;
	cout << strlen(Str) << endl;

	return 0;
}

//length是字符数组的容量
void RepalceBlank(char Str[], int length)
{
	if (Str == NULL || length <= 0)
		return;
	
	int originalLength = 0;//字符串Str 的实际长度
	int numberofBlank = 0;
	int i = 0;

	//遍历字符串,统计字符串的实际长度以及空格数
	while (Str[i] != '\0')
	{
		++originalLength;

		if (Str[i] == ' ')
			++numberofBlank;

		++i;
	}

	int newlength = originalLength + numberofBlank * 2;//替换空格之后的长度
        //如果数组溢出,放弃替换。
	if (newlength > length)
		return;
        //替换前后两个数组的指针序列号
	int indexofOriginal = originalLength;
	int indexofNew = newlength;
        //从替换前后两个数组的最后一个字符开始替换,所有的字符只移动一次,时间复杂度比较小。
	while (indexofOriginal >= 0 && indexofNew> indexofOriginal)
	{
		if (Str[indexofOriginal] == ' ')
		{
			Str[indexofNew--] = '0';
			Str[indexofNew--] = '2';
			Str[indexofNew--] = '%';
		}
		else
			Str[indexofNew--] = Str[indexofOriginal];

		--indexofOriginal;
	}
}

这个方法的时间复杂度为O(n),
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值