C语言实现字符串替换函数

news/2025/1/10 22:11:47/文章来源:https://www.cnblogs.com/rainbow70626/p/18664806
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
//字符串替换函数
/********************************************************************
*  Function:  my_strstr()
*  Description: 在一个字符串中查找一个子串;
*  Input:      ps: 源;      pd:子串
*  Return :    0:源字符串中没有子串; 1:源字符串中有子串;
*********************************************************************/
char * my_strstr(char * ps,char *pd)
{char *pt = pd;int c = 0;while(*ps != '\0'){if(*ps == *pd){while(*ps == *pd && *pd!='\0'){ps++;pd++;c++;}}else{ps++;}if(*pd == '\0'){return (ps - c);}c = 0;pd = pt;}return 0;
}/********************************************************************
*  Function:  memcpy()
*  Description: 复制一个内存区域到另一个区域;
*  Input:      src: 源;
count: 复制字节数.
*  Output:      dest: 复制目的地;
*  Return :      dest;
*********************************************************************/
void * memcpy(void * dest,const void *src,size_t count)
{char *tmp = (char *) dest, *s = (char *) src;while (count--)*tmp++ = *s++;return dest;
}/********************************************************************
*  Function:  str_replace()
*  Description: 在一个字符串中查找一个子串,并且把所有符合的子串用
另一个替换字符串替换。
*  Input:      p_source:要查找的母字符串; p_seach要查找的子字符串;
p_repstr:替换的字符串;
*  Output:      p_result:存放结果;
*  Return :      返回替换成功的子串数量;
*  Others:      p_result要足够大的空间存放结果,所以输入参数都要以\0结束;
*********************************************************************/
int str_replace(char *p_result,char* p_source,char* p_seach,char *p_repstr)
{int c = 0;int repstr_leng = 0;int searchstr_leng = 0;char *p1;char *presult = p_result;char *psource = p_source;char *prep = p_repstr;char *pseach = p_seach;int nLen = 0;repstr_leng = strlen(prep);searchstr_leng = strlen(pseach);do{ p1 = my_strstr(psource,p_seach);if (p1 == 0){strcpy(presult,psource);return c;}c++;  //匹配子串计数加1;printf("结果:%s\r\n",p_result);printf("源字符:%s\r\n",p_source);// 拷贝上一个替换点和下一个替换点中间的字符串nLen = p1 - psource;memcpy(presult, psource, nLen);// 拷贝需要替换的字符串memcpy(presult + nLen,p_repstr,repstr_leng);psource = p1 + searchstr_leng;presult = presult + nLen + repstr_leng;}while(p1);return c;
}
#define MAX 200
int main(void)
{int i = 0;char s[MAX] ={0};        //存放源字串char s1[MAX]={0};        //存放子字串char s2[MAX]={0};        //存放替换字串char result_a[2000] = {0};//存放替换结果;char *p,*ptm,*pr;puts("Please input the string for s:");scanf("%s",s);puts("Please input the string for s1:");scanf("%s",s1);puts("Please input the string for s2:");scanf("%s",s2);ptm = s;pr = result_a;i = str_replace(pr,ptm,s1,s2);printf("替换%d个子字符串;\r\n",i); printf("替换后结果:%s\r\n",result_a);system("pause");
}

上述代码链接:http://www.linuxidc.com/Linux/2013-01/77972.htm

接受网友的建议,优化修改如下:

#define _CRT_SECURE_NO_DEPRECATE
#include <stdio.h>
#include <string.h>/********************************************************************
*  Function:  my_strstr()
*  Description: 在一个字符串中查找一个子串;
*  Input:      ps: 源;      pd:子串
*  Return :    0:源字符串中没有子串; 1:源字符串中有子串;
*********************************************************************/
char * my_strstr(char * ps, char *pd)
{char *pt = pd;int c = 0;while (*ps != '\0'){if (*ps == *pd){while (*ps == *pd && *pd != '\0'){ps++;pd++;c++;}}else{ps++;}if (*pd == '\0'){return (ps - c);}c = 0;pd = pt;}return 0;
}/********************************************************************
*  Function:  my_memcpy()
*  Description: 复制一个内存区域到另一个区域;
*  Input:      src: 源;
count: 复制字节数.
*  Output:      dest: 复制目的地;
*  Return :      dest;
*********************************************************************/
void * my_memcpy(void * dest, const void *src, size_t count)
{char *tmp = (char *)dest, *s = (char *)src;while (count--)*tmp++ = *s++;return dest;
}/********************************************************************
*  Function:  str_replace()
*  Description: 在一个字符串中查找一个子串,并且把所有符合的子串用
另一个替换字符串替换。
*  Input:      p_source:要查找的母字符串; p_seach要查找的子字符串;
p_repstr:替换的字符串;
*  Output:      p_result:存放结果;
*  Return :      返回替换成功的子串数量;
*  Others:      p_result要足够大的空间存放结果,所以输入参数都要以\0结束;
*********************************************************************/
int str_replace(char *p_result, char* p_source, char* p_seach, char *p_repstr)
{int c = 0;int repstr_leng = 0;int searchstr_leng = 0;char *p1;char *presult = p_result;char *psource = p_source;char *prep = p_repstr;char *pseach = p_seach;int nLen = 0;repstr_leng = strlen(prep);searchstr_leng = strlen(pseach);do {p1 = strstr(psource, p_seach);if (p1 == 0){strcpy(presult, psource);return c;}c++;  //匹配子串计数加1;//printf("结果:%s\r\n", p_result);//printf("源字符:%s\r\n", p_source);// 拷贝上一个替换点和下一个替换点中间的字符串nLen = p1 - psource;memcpy(presult, psource, nLen);// 拷贝需要替换的字符串memcpy(presult + nLen, p_repstr, repstr_leng);psource = p1 + searchstr_leng;presult = presult + nLen + repstr_leng;} while (p1);return c;
}
#define MAX 200
int main(void)
{int i = 0;char s[MAX] = { 0 };        //存放源字串char s1[MAX] = { 0 };        //存放子字串char s2[MAX] = { 0 };        //存放替换字串char result_a[2000] = { 0 };//存放替换结果;puts("Please input the string for s:");gets_s(s,MAX);puts("Please input the string for s1:");gets_s(s1, MAX);puts("Please input the string for s2:");gets_s(s2, MAX);i = str_replace(result_a, s, s1, s2);printf("替换%d个子字符串;\r\n", i);printf("替换后结果:%s\r\n", result_a);
}

博客链接:https://blog.csdn.net/earbao/article/details/20227163/

其他链接:C语言实现字符串替换的示例代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/867358.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Git学习遇到的抽风问题记录

学习git commit和git add的区别的时候,一不小心git commit 没有加“-m”,进入了一个vim配置页面:搞了半天死活出不来,而且担心修改了不该动的东西 解决办法:输入“:”然后输入qa!//放弃任何更改并退出 解决!

咸鱼学习第一天

markdown以及编辑器obsidian的学习 1 创建新笔记Ctrl+n Ctrl+o (可以快速打开需要的笔记;可以加文档名+笔记标题)2 文档属性设置 三个“---”可以添加日期、别名、标签 3 最常用语言一个’-‘加一个空格是一个小圆点 几个“#”+一空格就是几级标题 链接设置①:如我要在…

BurpSuite实操之重发器功能使用

手动操作来触发单独的HTTP请求,并进行应用程序响应的工具,此功能用于根据不同的情况修改和发送相后的请求并分析,通过调整Request的参数,不断尝试,通过Response查看状态,从而节省在浏览器中操作的时间。 在渗透测试过程中,我们经常使用Repeater进行请求与响应的消息验证…

G1原理—3.G1是如何提升垃圾回收效率

大纲 1.G1为了提升GC的效率设计了哪些核心机制 2.G1中的记忆集是什么 3.G1中的位图和卡表 4.记忆集和卡表有什么关系 5.RSet记忆集是怎么更新的 6.DCQ机制的底层原理是怎样的 7.DCQS机制及GC线程对DCQ的处理提升G1垃圾回收器GC效率的黑科技 G1设计了一套TLAB机制 + 快速分配机制…

1.10日学习笔记之C++的类

类其实就是一种数据类型,和结构相似。类的成员包括两类,属性(成员变量)和行为(成员函数)。 成员函数定义的两种方法(可能有多种,觉得这两种比较常用) 1、将类的成员函数定义在类体内,如 class CPerson {public: short age;short getage(){return age;}};2、将类的成…

着火智能监测识别摄像机

着火智能监测识别摄像机利用了先进的图像处理技术和人工智能算法,能够快速、准确地检测环境中的着火点,从而及时采取必要的安全措施。其工作原理如下:首先,摄像机配备高清摄像头,能够实时捕捉并传输环境图像。这些图像通过内置的处理单元,进行高效处理和分析。其次,利用…

BurpSuite实操之测试器功能

对web应用程序进行自动化攻击。此功能有多种用途,如漏洞利用、模糊测试、进行暴力pojie等1、目标设置代理发送过来请求的目标主机及端口信息。 输入要攻击的目标及端口2、位置设置在这个模块可以设置攻击的参数,及攻击使用的类型(1)Sniper-狙击手(2)Battering ram-破城锤…

采沙船智能监测识别摄像机

采沙船智能监测识别摄像机还支持数据记录和分析功能,可以生成详尽的非法采沙统计报告和趋势分析,为河流管理决策提供科学依据。管理部门可以通过监控系统的数据分析,制定精准的禁采政策和优化河流资源管理,有效保护水域生态环境,防止非法采砂对生态系统的破坏。在实际应用…

C api简单查询需要的几步

C api查询简单需要的几步 1.准备sql语句 2.绑定变量 通过sqlstatement类bindout方法将查询出来的值与存储他们的变量绑定。 这里绑定是为了以后从结果集中提取一行时只需要一行就可以完成将提取出 来的变量赋值。 3.执行execute 在这一步将sql语句执行。在这里有几个重点 mysql…

iterm2

外观 这个github上的项目提供了很多主题 https://iterm2colorschemes.com/ 亮色主题感觉还可以的几个: OneHalfLight、BuiltinLight、BlulocoLight、Materil、ProLight、Tango Half Adapted 下面截图是基于 Tango Half Adapted用蓝色代替青色,黄色加深之后的效果(vim括号插件…

22. MDI窗口设计

一、什么是MDI窗口MDI 窗口(Multiple-Document Interface),又称多文档界面,它主要用于同时显示多个文档,每个文档显示在各自的窗口中。MDI 窗口中通常包含子菜单和窗口菜单,用于在窗口或文档之间进行切换。用 QMainWindow 建立的主界面,通常会同时建立或打开多个相互独立…

详解:订单履约系统规划

大家好,我是汤师爷~ 什么是订单履约系统? 订单履约是从消费者下单支付到收到商品的全流程管理过程,包括订单接收、订单派单、库存分配、仓储管理和物流配送等环节,核心目标是确保商品准时、准确地送达消费者手中。 通过订单履约系统,消费者可以实时了解商品的物流状态和预…