题目要求
给定一个字符任意长度的字符串,要求把空格替换为%20。
示例
原始字符串: this is a test sample!
替换字符串: this%20is%20a%20test%20%20sample!
解题思路,
- 先统计出原始字符串中空格数量
- 计算新生成字符串存储所需要的空间,原始字符串长度 + 2 * 空格数量 + 1(字符串末尾需要\0)
- 循环遍历原始字符串,每当检测到空格后就拷贝%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;
}
小结
太久没有刷题,感觉脑子越来越呆板了。
浙公网安备 33010602011771号