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