题目要求

 给定一个字符任意长度的字符串,要求把空格替换为%20。

示例

 原始字符串: this is a test sample!
 替换字符串: this%20is%20a%20test%20%20sample!

解题思路,

  1. 先统计出原始字符串中空格数量
  2. 计算新生成字符串存储所需要的空间,原始字符串长度 + 2 * 空格数量 + 1(字符串末尾需要\0)
  3. 循环遍历原始字符串,每当检测到空格后就拷贝%20到新字符串中,否则就拷贝原始字符串中当前字符

实现代码

统计空格数量

// 统计原始字符串中空格数量
while(*pReceive != '\0'){
    if((int)*pReceive == 32)
    {
        uiBlankCount += 1;
    }
    pReceive++;
}

就字符串替换到新字符串空间

while(*pReceive != '\0'){
    if((int)*pReceive == 32)
    {
        // 检测到空格,拷贝%20,然后内存指针向后挪动三个字节
        memcpy(pNeedReplaceBuf, "%20", sizeof(char)*3);
        pNeedReplaceBuf += 3;
    }
    else{
        // 没有检测到空格,拷贝原始字符,内存指针向后挪动一个字节
        memcpy(pNeedReplaceBuf, pReceive, sizeof(char));
        pNeedReplaceBuf++;
    }
    pReceive++;
}

完整代码如下

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char* replace_blank(char *str);

//返回新的替换后的字符串内存空间由使用者自己释放
char* replace_blank(char *str){
    unsigned int uiBlankCount = 0;
    unsigned int uiSrcLen = 0;
    unsigned int uiReplaceLen = 0;

    char *pReceive = NULL;
    char *pNeedReplaceBuf = NULL;
    char *pNeedReplaceBufhead = NULL;
    
    pReceive = str;

    // 获取原始字符串长度,不包含'\0'
    uiSrcLen = strlen(pReceive);

    // 统计原始字符串中空格数量
    while(*pReceive != '\0'){
        if((int)*pReceive == 32)
        {
            uiBlankCount += 1;
        }
        pReceive++;
    }

    // 替换后的字符串的长度 = 原始字符串长度 + 空格数量 * 2 + 1
    uiReplaceLen = uiSrcLen + uiBlankCount * 2 + 1;

    pNeedReplaceBuf = (char*)malloc(sizeof(char) * uiReplaceLen);
    if(NULL == pNeedReplaceBuf){
        printf("malloc buffer failed\n");
    }
    memset(pNeedReplaceBuf, 0x0, sizeof(char) * pNeedReplaceBuf);

    // 保存buffer首地址,用于返回替换后的新字符串
    pNeedReplaceBufhead = pNeedReplaceBuf;

    pReceive = str;
    // 在新内存中填充替换空格后的新字符串
    while(*pReceive != '\0'){
        if((int)*pReceive == 32)
        {
            // 检测到空格,拷贝%20,然后内存指针向后挪动三个字节
            memcpy(pNeedReplaceBuf, "%20", sizeof(char) * 3);
            pNeedReplaceBuf += 3;
        }
        else{
            // 没有检测到空格,拷贝原始字符,内存指针向后挪动一个字节
            memcpy(pNeedReplaceBuf, pReceive, sizeof(char));
            pNeedReplaceBuf++;
        }
        pReceive++;
    }
    memcpy(pNeedReplaceBuf, "\0", sizeof(char));

    printf("replace str list: %s\n", pNeedReplaceBufhead);

    return pNeedReplaceBufhead;
}

int main(){
    char *pRecevieBuffer = NULL;

    pRecevieBuffer = replace_blank("sample- -1-case-  -2- -1-   -3- -");

    free(pRecevieBuffer);
    return 0;
}

小结

 太久没有刷题,感觉脑子越来越呆板了。

posted on 2023-06-18 21:35  放纵-F  阅读(53)  评论(0)    收藏  举报