题目描述
请实现一个函数,将一个字符串中的空格替换成“%20”。
例如,当字符串为We Are Happy.则经过替换之后的字符串为 We%20Are%20Happy。
在网络编程中,如果一个URL参数含有特殊字符,如空格,#等,可能导致服务端无法获得准确的参数值。我们需要将这些特殊字符转换成服务端可以识别的字符,转换的规则是在'%'后面跟上ASCII码的两位十六进制表示。比如空格的ASCII码是32,也就是十六进制的0x20,因此空格被替换为了%20 。再比如#的ASCII码为35,即0x23,因此他在URL中应替换为%23 。(URL相关的可以参考我Java爬虫的那几篇)
将一个空格替换为三个字符 。
如果按顺序遍历字符串,在保证字符串有足够的空间下,需要对后边的字符串进行大量的移动。
较为简单的方法是,遍历一边字符串,记录空格数,假如为字符串原长度为10,空格数为3 , 那么替换后字符串的长度应该为 10+2*3 。
然后倒序操作字符串,遇到非空格的字符串,则填到扩展位,然后扩展位减一,遇到空格,则在扩展位位置填入'0' ,'2' ,'%' ,每次扩展位各加一 。
1 #include<bits/stdc++.h> 2 3 using namespace std ; 4 5 int main() 6 { 7 char c[] = "We are Happy" ; 8 int len = 13 ; 9 int num = 0 ; // 空格数 10 for(int i=0;i<len;i++){ 11 if(c[i]==0x20){ 12 num ++ ; 13 } 14 } 15 16 int newLen = len + 2 * num ; // 替换后字符串应该的长度 17 char *a = new char[newLen]; 18 for(int i=len-1;i>=0;i--){ 19 if(c[i]!=0x20){ 20 a[newLen--] = c[i] ; 21 }else { 22 a[newLen--] = '0'; 23 a[newLen--] = '2'; 24 a[newLen--] = '%'; 25 } 26 } 27 cout << a <<endl ; 28 return 0 ; 29 }