字符串中替换空格

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zhuoya_/article/details/78628813

在网络编程中,如果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);
}

结果显示:


展开阅读全文

没有更多推荐了,返回首页