替换空格【每日一题】

来源:互联网 发布:制作音效的软件 编辑:程序博客网 时间:2024/06/03 20:19

题目:实现一个函数,要求吧字符串中的所有空格替换成“%20”。例如
“hello world ” ——> ”hello%20world%20”
以前一直觉得做这种题目没什么意义,直到前两天学了网络编程才知道这种题目的意义非比寻常。
在网络编程中,如果URL参数中含有特殊的字符,如空格、’#’等,导致服务器端无法识别时,就把这些特殊的字符转换成可以识别的字符。规则:%加上十六进制的ascii码,例如‘#’的ascii码是0x23(16进制),就替换成%23,不防在浏览器中试一下输入“hello#hao”,看下地址栏中的参数。
题目分析:
在c语言中存字符串最后一位是认为”\0“的,例如a[] = “12”,那么a的长度为3,a[0]=’1’,a[1]=’2’,a[2]=’\0’,‘\0’是空字符,其ascii码为0如下图。
思路一:
可以再造一个数组,遇到空格就替换成”%20“这样就造成了空间的浪
费,可以实现但不是最佳相比之下:b[] = {‘1’, ‘2’}长度则为2.
思路二:
因为把空格替换为”%20“,每次替换多2个字符,因此可以统计出字符串中空格的总个数,然后新数组大小为 “原数组大小 + 2*空格数 ”。从后往前处理:遇到非空格,直接搬到后面,遇到空格替换为”%20“. 直到待插入位置指针和原数组为指针重合位置。

#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAXLEN 100void ReplaceBlack(char *str){    if(str != NULL)    {        int i,end,pos,BlackCount = 0;        size_t lenOld = strlen(str),lenNew;        for(i=0;str[i]!='\0';i++)        {            if(str[i] == ' ')                BlackCount++;        }        lenNew = lenOld+2*BlackCount;        if(lenNew > MAXLEN)            return ;        pos = lenNew-1;        end = lenOld-1;        while(pos != end)        {            if(str[end] != ' ')                str[pos--] = str[end--];            else            {                str[pos--] = '0';                str[pos--] = '2';                str[pos--] = '%';                end--;            }        }    }}int main(){    char *a = (char*)malloc(sizeof(char) * MAXLEN);    if(NULL != a)    {        strcpy(a, "hell world ");        ReplaceBlack(a);        printf("%s\n", a);        free(a);    }    return 0;}