替换空格

来源:互联网 发布:北美海关数据 编辑:程序博客网 时间:2024/06/09 18:22

请实现一个函数,把字符串中的每个空格替换成”%20”。例如输入“We are happy.”, 则输出”We%20are%20happy.”。
在网络编程中,如果URL参数中含有特殊字符,如空格、’#’等,可能导致服务器端无法获得正确的参数值。我们需要将这些特殊符号转换成服务器可以识别的字符。转换的规则是在’%’后面跟上ASCII码的两位十六进制的表示。比如空格的ASCII码是32,即十六进制的0x20,因此空格被替换成”%20”。再比如’#’的ASCII码为35,即十六进制的0x23,它在URL中被替换为”%23”。

思路一:从左向右扫描字符串替换

一个字符替换为三个
每遇到一个空格,空格后面所有字符向右移动两个位置
字符串长度为n, 对每个空格而言,需要移动后面O(n)个字符
算法的时间复杂度为O(n^2)

思路二:从右到左扫描字符串替换
统计空格数,字符串长度增加 空格数 * 2
维持两个指针p1, p2
p1指向原字符串长度末尾, p2指向新字符串长度末尾
当p1遇到空格时, p2 向前移动并替换字符为 ‘0’ ‘2’ ‘%’
把p1指针指向的字符拷贝到p2指针指向的字符
所有字符都只移动一次,时间复杂度为O(n)
下面的C实现是思路二的实现代码:

////  main.c//  func////  Created by 52coder on 2017/12/18.//  Copyright © 2017年 52coder. All rights reserved.//#include <stdio.h>#include <string.h>void trimspace(char str[],int len){    int i = 0;    //空格个数    int space = 0;    //替换前字符串长度    int real = 0;    //新长度    int newlen = 0;    while(str[i] != '\0')    {        real += 1;        if(' ' == str[i])        {            space += 1;        }        i++;    }    //计算实际长度,每个空格多出两个长度    newlen = real + space * 2;    if(newlen > len)    {        printf("Not enough space.newlen = %d,len = %d\n",newlen,len);        return ;    }    int src = real;    int dst = newlen;    while(src >=0)    {        if (' ' == str[src])        {            str[dst--]='0';            str[dst--]='2';            str[dst--]='%';        }        else        {            str[dst--] = str[src];        }        --src;    }}int main(int argc, const char * argv[]){    //测试用例    char str[100] = "We are happy.";    trimspace(str,sizeof(str));    printf("%s\n",str);    //测试用例    char s[100] = "We are happy ,are you ojbk?";    trimspace(s,sizeof(s));    printf("%s\n",s);    //测试用例    char a[100] = "We are happy ,are you ojbk    ?    ";    trimspace(a,sizeof(a));    printf("%s\n",a);    //测试用例    char b[16] = "We are happy.";    trimspace(b,sizeof(b));    printf("%s\n",b);    return 0;}
阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 华光诞 华光祖师为什么会捉鬼 华光大帝与二郎神哪个大 华光大帝天界排名 华光的qz11-e强力蒸汽挂烫机 华光的挂烫机怎么样 华光大帝生日 华光摄影艺术职业学院 华光 贝尔莱德 600475 huaguang 华光股份股吧 华光挂烫机 华光学院 华光教务处 华光学院教务处 泉州华光教务处 华光职业学院 泉州华光学院 泉州华光职业学院教务处 泉州华光 华光熨烫机 华光线缆 浪潮华光光电子有限公司 华光门诊部 华光电器 华光医院 华光骨瓷 华光电镀厂 华光旗舰店 华光挂烫 华光制冷 华光挂烫机怎么样 华光电子管 华光肥皂 华光学校 华光钢构 华光眼镜 华光科技 华光性保健 华光锅炉