C语言替换字符串

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



/**
*
* @author: cnscn@163.com
* @reference: lovesnow1314@http://community.csdn.net/Expert/TopicView3.asp?id=5198221
*
* 用新子串newstr替换源字符串src中的前len个字符内所包含的oldstr子串
*
* @param char* dest 目标串,也就是替换后的新串
* @param const char* src 源字符串,被替换的字符串
* @param const char* oldstr 旧的子串,将被替换的子串
* @param const char* newstr 新的子串
* @param int len 将要被替换的前len个字符
*
* @return char* dest 返回新串的地址
*
*/
char *strreplace(char *dest, char *src, const char *oldstr, const char *newstr, size_t len)
{
 //如果串相等,则直接返回
if(strcmp(oldstr, newstr)==0)
 return src;

//子串位置指针
char *needle;

//临时内存区
char *tmp;

//把源串地址赋给指针dest,即让dest和src都指向src的内存区域
dest = src;

//如果找到子串, 并且子串位置在前len个子串范围内, 则进行替换, 否则直接返回
while((needle = strstr(dest, oldstr)) && (needle -dest <= len))
 {
 //分配新的空间: +1 是为了添加串尾的'\0'结束符
tmp=(char*)malloc(strlen(dest)+(strlen(newstr)-strlen(oldstr))+1);

//把src内的前needle-dest个内存空间的数据,拷贝到arr
 strncpy(tmp, dest, needle-dest);

//标识串结束
tmp[needle-dest]='\0';

//连接arr和newstr, 即把newstr附在arr尾部, 从而组成新串(或说字符数组)arr
 strcat(tmp, newstr);

//把src中 从oldstr子串位置后的部分和arr连接在一起,组成新串arr
 strcat(tmp, needle+strlen(oldstr));

//把用malloc分配的内存,复制给指针retv
 dest = strdup(tmp);

//释放malloc分配的内存空间
free(tmp);
 }

return dest;
}

int main()
{
 char *str="http://192.168.1.1:58763/result.xml";
 char *old="192.168.1.1";
 char *new="127.0.0.1";

 char *dest;
 //分配内存空间: 大小 == src的长度 + newstr和oldstr长度差(可能是正负或0)+1
 printf("%s\n",strreplace(dest, str, old, new,1));
 printf("%s\n",strreplace(dest, str, old, new,5));
 printf("%s\n",strreplace(dest, str, old, new,9));
 printf("%s\n",strreplace(dest, str, old, new,11));

 printf("%s\n",strreplace(dest, str, old, new,40));

 if(dest)
 {
     free(dest);
 }
 return 0;
}






在C语言中,标准库并没有提供专门的字符串替换函数,如Python的`str.replace()`。不过,你可以通过结合`strcpy()`、`strlen()`和指针操作来实现基本的字符串替换。下面是一个简单的例子,展示了如何替换原始字符串中的一部分内容: ```c #include <stdio.h> #include <string.h> // 自定义替换字符串函数 char* replace_string(char *str, const char *old_subst, const char *new_subst) { size_t old_length = strlen(old_subst); size_t new_length = strlen(new_subst); size_t index; // 遍历整个字符串 for (index = 0; ; index++) { // 如果找到了旧子串 if (strstr(&str[index], old_subst) != NULL) { // 记录旧子串起始位置 size_t start_pos = index; // 从头开始搜索新子串的位置 size_t end_pos = start_pos + old_length - 1; while (end_pos < strlen(str) && str[end_pos] == old_subst[end_pos]) { end_pos++; } // 创建一个新的临时字符串,包含旧子串之前的内容和新子串 char *temp = malloc(index + (end_pos - start_pos) + new_length + 1); strncpy(temp, str, index); strcat(temp, new_subst); // 更新原字符串的这部分内容 memmove(&str[index], &str[index + old_length], end_pos - index + 1); // 结合更新过的子串和剩余部分 strcat(str, temp + old_length); free(temp); // 搜索下一段旧子串 index += old_length - 1; } else { break; // 找不到更多旧子串就停止 } } return str; } int main() { char str[] = "Hello, world! This is a test."; char old[] = "world"; char new_str[] = "CSDN"; str = replace_string(str, old, new_str); printf("替换后的字符串: %s\n", str); // 输出: Hello, CSDN! This is a test. return 0; } ``` 这个函数会在原始字符串中查找旧子串,并将其替换为新子串。需要注意的是,这个实现仅能处理单次替换,对于连续出现的旧子串,你需要在循环里多次处理。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值