分享一下我写的 “字符串子串替换的函数”
[C] 纯文本查看 复制代码 /*
2018年8月16日 11:49:44
*/
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int replace_str(const char * src, const char * key_src, const char * key, char ** buf);
int replace_count(const char * src, const char * key_src, int * n);
int main()
{
char * str = "a 123 b 156 LL a f a 1";
char * buf;
int ret = 0;
puts("替换前");
puts(str);
ret = replace_str(str, "a", "8888", &buf);
if (ret != 0)
{
printf("%d", ret);
system("pause");
return -1;
}
puts("替换后");
puts(buf);
/*释放内存*/
if (buf != NULL)
{
free(buf);
buf = NULL;
}
return 0;
}
int replace_str(const char * src, const char * key_src, const char * key, char ** buf)
{
/*参数错误判断*/
if (src == NULL || key == NULL || buf == NULL)
{
return -1;
}
int len_src;
int len_dst;
char * tem_src;
char * tem_buf;
int count = 0;
int ret;
len_src = strlen(src);
tem_src = (char *)malloc(len_src * sizeof(char) + 1);
if (tem_src == NULL)
{
return -2;
}
memset(tem_src, 0, sizeof(len_src * sizeof(char) + 1));
strcpy(tem_src, src);
ret = replace_count(tem_src, key_src, &count); /*判断替换项数*/
if (ret != 0)
{
return ret;
}
/*分配足够的空间*/
len_dst = (len_src - count * strlen(key_src) + count * strlen(key) + 1) * sizeof(char); /*要增加或减少的空间*/
tem_buf = (char *)malloc(len_dst);
if (tem_buf == NULL)
{
return -5;
}
memset(tem_buf, 0, len_dst);
//"abcd1234adcnwdabcd qwd abcd";
const char * p = src;
const char * q;
int len = 0; /*记录要连接的长度*/
while (1)
{
q = strstr(p, key_src);
if (q == NULL) /* 表示找不到数据后。把后面的数据放进去 */
{
strcat(tem_buf, p);
break;
}
len = q - p; /* 不需要替换数据的长度 */
strncat(tem_buf, p, len); /* 先把不需要替换的数据放进去 */
strcat(tem_buf, key); /* 把要替换的数据放进去 */
p = q + strlen(key_src); /* 跳过找到的key_src */
}
*buf = tem_buf;
if (tem_src != NULL)
{
free(tem_src);
tem_src = NULL;
}
return 0;
}
int replace_count(const char * src, const char * key_src, int * n)
{
if (src == NULL || key_src == NULL || n == NULL)
{
return -3;
}
int i = 0;
int len = strlen(key_src);
const char * p = src;
const char * q;
while (1)
{
q = strstr(p, key_src);
if (q == NULL)
{
break;
}
else
{
p = q + len;
++i;
}
}
if (i == 0)
{
*n = i;
return -4; /* 没有找到 */
}
*n = i;
return 0;
}
|