字符串中替换空格

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

在这里先说明一下什么是URL;再讨论将一个一个空格如何替换成“%20”.


替换空格解题思路:(前提是有足够大的空间容纳下空格替换成“20%”后的所有字符)

第一步:计算空格的多少,从而计算出替换后的字符串长度。

第二步:准备两个指针p1和p2;p1指向原始字符串的末尾;p2指向替换之后字符串的末尾。

第三步:逐个把p1指向的字符复制给p2所指向的空间;当p1遇到空格时,把p1向前移动一格;p2向前移依次把“20%”放进去。

如此循环,当p1和p2指向同一个位置时,表明所有空格替换完。

示例:(当有字符串arr[50]={"We are happy!"};时,我们画出移动的全过程,如下)

这种方法的时间复杂度为O(n).

下面看一下代码实现:

#include<stdio.h>
#include<string.h>
void ReplaceBlank(char string[],int length)//length为总容量
{
	if(string==NULL || length<=0)
	{
		return ;
	}
	int originalLength=0;//用来表示实际长度
	int numofBlank=0;//用来表示空格数
	int i=0;
	while(string[i]!='\0')
	{
		++originalLength;
		if(string[i]==' ')
		{
			++numofBlank;
		}
		++i;
	}

	int newLength=originalLength+numofBlank*2;//把空格换成20%以后的实际长度
	if(newLength>length)
	{
		return ;
	}

	int indexOfOriginal=originalLength;//有空格时的数组下标
	int indexOfNew=newLength;//表示替换后的下标
	while(indexOfOriginal>=0 && indexOfNew>indexOfOriginal)
	{
		
		if(string[indexOfOriginal]==' ')
		{
			string[indexOfNew --]='0';
			string[indexOfNew --]='2';
			string[indexOfNew --]='%';
		}
		else
		{
			string[indexOfNew --]=string[indexOfOriginal];
		}
		--indexOfOriginal;
	}
}

int main()
{
	char arr[50]="I Am Happy";
	ReplaceBlank(arr,50);
	printf("%s\n",arr);

	char brr[50]="I  Am Happy";
	ReplaceBlank(brr,50);
	printf("%s\n",brr);

	char crr[50]="  I Am Happy";
	ReplaceBlank(crr,50);
	printf("%s\n",crr);

	char drr[50]="IAmHappy";
	ReplaceBlank(drr,50);
	printf("%s\n",drr);

	char err[50]=" ";
	ReplaceBlank(err,50);
	printf("%s\n",err);

	char frr[50]="NULL";
	ReplaceBlank(frr,50);
	printf("%s\n",frr);
}

结果显示:


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值