今天开发时遇见一个需要替换字符串的操作
大致的需求如下:实现一个字符串替换函数strreplace(char* str, char* sub, char* rep) ,str为原字符串,sub是待替换的字符串,rep为替换字符,sub可长可短,rep可长可短。
主要要考虑的是sub小于rep时,str的buf不够的情况
看了网上一些人的实现,也写了代码测试,结果发现基本都不可用,主要有几个关键点
1、原字符串中有多个需要替换时,代码仅替换了第一个
2、几乎所有的实现代码都没有对入参做安全检查
3、使用malloc动态分配时计算的方法不正确,导致分配的空间变少,产生段错误
于是我自己实现了一个,经过了自测,只是最大的buf是512如果要用更大的话就自己加大吧
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
char replace_buf[512]; char *replace(char *src, char *sub, char *dst) { int offset = 0; int srcLen, dstLen; if (!src || !sub || !dst) { return NULL; } // printf("sub=%s,dst=%s\n", sub, dst); memset(replace_buf, 0, sizeof(replace_buf)); srcLen = strlen(src); dstLen = strlen(dst); char *p = src, *p1 = NULL; do { p1 = strstr(p, sub); if (p1) { memcpy(replace_buf + offset, p, p1 - p); offset += p1 - p; memcpy(replace_buf + offset, dst, dstLen); offset += dstLen; p = p1 + 1; } else { memcpy(replace_buf + offset, p, srcLen - (p - src)); offset += strlen(src) - (p - src); } } while (p1 && *p1); *(replace_buf + offset) = '\0'; return replace_buf; } |