首页 > 其他分享 >C语言实现字符串替换函数

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

时间:2025-01-10 22:23:50浏览次数:1  
标签:ps C语言 char result pd 字符串 替换

#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语言实现字符串替换的示例代码

标签:ps,C语言,char,result,pd,字符串,替换
From: https://www.cnblogs.com/rainbow70626/p/18664806

相关文章

  • 124.【C语言】数据结构之快速排序的小区间优化和非递归的解决方法
    目录1.小区间优化测试代码运行结果2.非递归的解决方法(重要!)递归产生的问题一般来说,递归改非递归有两种方法算法分析递归产生的二叉树栈的示意图先写代码框架再填写细节部分1.小区间优化回顾121.【C语言】数据结构之快速排序(未优化的Hoare排序存在的问题)以及......
  • C语言分支和循环(上)
    分⽀和循环分⽀和循环(上)1.if语句1.1if1.2else2.关系操作符3.条件操作符4.逻辑操作符:&&,||,!5.switch语句分⽀和循环(上)C语⾔是结构化的程序设计语⾔,这⾥的结构指的是顺序结构、选择结构、循环结构,C语⾔是能够实现这三种结构的,其实我们如果仔细分析,我们⽇......
  • 数据结构——单链表(C语言版:超详细)
    目录一、引言1.数据结构的重要性2.单链表在其中的地位二、什么是单链表1.单链表的定义2.基本概念解释三、单链表的结构特点1.与数组对比的优势2.存在的劣势四、单链表的基本操作1.节点的创建2.动态申请一个节点3.插入节点3.1尾插3.2头插3.3在pos之前插入3.4在......
  • 总结并拆解所有新手常用的——String API(二)(字符串)
    前言:String类包括的方法可用于检查序列的单个字符、比较字符串、搜索字符串、提取子字符串、创建字符串副本并将所有字符全部转换为大写或小写.......小编这次就比较全面系统的带大家总结清楚几乎所有string常用的API,并且带大家拆解清楚,能够灵活使用!!!小编最近熬夜牙疼的......
  • JavaScript字符串拓展:实用方法与示例全解析
    一、引言:为什么要学习JS字符串拓展在前端开发的世界里,JavaScript如同基石般支撑着网页的交互与动态呈现。而字符串作为我们日常操作中最频繁接触的数据类型之一,其原生方法在面对复杂多变的业务需求时,有时难免显得捉襟见肘。此时,JS字符串拓展方法就如同一个个得力助手,闪亮......
  • JS-27 字符串方法_split()
    split方法按照给定规则分割字符串,返回一个由分割出来的子字符串组成的数组'it|sxt|zifuchuan'.split('|')//["it","sxt","zifuchuan"]如果分割规则为空字符串,则返回数组的成员是原字符串的每一个字符。'a|b|c'.split('')//["a","|","b&q......
  • ubuntu 18.04下neovim手动添加treesitter支持(c语言为例)
    环境准备rustcurl--proto'=https'--tlsv1.2-sSfhttps://sh.rustup.rs|shnode.jshttps://nodejs.org/dist/v16.20.2/node-v16.20.2-linux-x64.tar.xzneovimhttps://github.com/neovim/neovim-releases/releases/download/v0.10.3/nvim-linux64.tar.g......
  • JS-26 字符串方法_trim()
    trim方法用于去除字符串两端的空格,返回一个新的字符串,不改变源字符串'zifuchuan'.trim()//"helloworld" 该方法去除的不仅仅是空格,还包括制表符(\t、\v)、换行符(\n)和回车符(\r)'\r\zifuchuan\t'.trim()//'zifuchuan' ES6扩展方法,trimEnd和trimStart()方法" zifuchua......
  • SQLSER中使用DATALENGTH 函数返回字符串的字节长度
    DATALENGTH函数返回字符串的字节长度,这对于varchar类型的字段非常有用,因为varchar类型的字段存储的是变长字符串,其实际占用的字节数可能小于定义的最大长度。示例假设有一个表Articles,其中有一个varchar类型的字段Content,你想查询每篇文章内容的实际占用字节数,可以使用......
  • JS-25 字符串方法_indexOF()
    indexOf方法用于确定一个字符串再另一个字符串中第一次出现的位置,返回结果是匹配开始的位置。如果返回-1,就表示不匹配'helloworld'.indexOf('o')//4'helloworld'.indexOf('a')//4-1'床前明月光,疑是地上霜。一去二三里,举头望明月,低头思故乡。'.indexOf("一去二三里")//12 i......