;
flag=false;
}
}
if(index>0&&str[index-1]==' ') //处理字符串最后的多余空格
{
str[index-1]='\0';
}
else
{
str[index]='\0';
}
cout<<str<<endl;
return 0;
}
在网络编程中,如果URL参数中含有特殊的字符,如空格、“#”等,导致服务器端无法识别时,就把这些特殊的字符转换成可以识别的字符。转换规则是:%加上十六进制的ASCII码,例如空格的ASCII码是32(16进制为0x20),就被替换成%20。
3.替换空格
编写一个程序,把字符串中的每个空格替换成“%20”。例如输入“We are happy.”,则输出“We%20are%20happy.”。
将长度为1的空格替换为长度为3的“%20”,字符串的长度会变长。如果另外开辟一个新的数组来存放替换空格后的字符串,那么这个问题非常容易解决。设置两个指针分别指向新旧字符串首元素,遍历原字符串,如果碰到空格就在新字符串中填入“%20”,否则就复制原字符串中的内容。但这种新开辟数组保存结果字符串的做法,会造成空间的浪费。
如果在原字符串后面有足够多的空余空间,可以在原来的字符串上做替换。下面来探讨替换的方法。
因为把空格替换为”%20“,每次替换多2个字符,因此在可以统计出原来字符串的长度和其中空格的总个数后,计算出结果字符串的长度为“原字符串长度 + 2*空格数 ”。
替换操作从后往前进行,思路为:遇到非空格,直接搬到后面;遇到空格,替换为“%20”。 直到待插入位置指针和原字符串的扫描指针的位置重合。具体过程描述为:
(1)首先遍历原字符串str,统计出原字符串的长度strlen以及其中的空格数量blanknum。
(2)根据原字符串的长度和空格的数量,求出结果字符串的长度newlen,即newlen=strlen+blanknum*2。
(3)定义两个指针p1和p2分别指向原字符串和结果字符串的末尾位置,即p1=str+strlen、 p2=str+newlen。
(4)如果p1指向内容不为空格,那么将内容直接赋值给p2指向的位置,且p2指针前移;如果p1指向内容为空格,那么从p2指向位置开始赋值“02%”。
(5)p1指针前移。
(6)直到p1==p2时,表明字符串中的所有空格都已经替换完毕。
例如,按上述操作过程,将字符串“Hello world ”中的空格进行替换的操作如图1所示。
图1 空格替换操作过程
#include<iostream>
using namespace std;
int main()
{
char str[81];
cin.getline(str,80,'\n');
int strlen=0;
int blanknum=0;
int i=0;
//求字符串长度和空格数量
while(str[i]!='\0')
{
strlen++;
if(str[i]==' ')
blanknum++;
i++;
}
int newlen=strlen+blanknum*2;//求新字符串长度
if(newlen>=80)
{
cout<<"替换后,串超过了预定义的长度。"<<endl;
return 0;
}
//设置两个指针指向新旧数组末尾
char *p1,*p2;
p1=str+strlen; p2=str+newlen;
//当上面两个指针指向同一个元素则表明没有空格
while(p1>=str && p2>p1)
{
if(*p1==' ')