替换字符串中出现的某段字符串的C语言和C++实现方式

2023-10-31

C语言实现方式

使用了循坏来重复替换操作,直到无法再找到需要替换的子串为止。具体实现如下:

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

void replace_all(char *str, const char *orig, const char *rep) {
	// 1. 定义一个静态变量buffer来存储替换后的字符串
    static char buffer[4096];
    // 2. 使用指针p指向原始字符串str,并获取orig和rep的长度。
    char *p = str;
    size_t orig_len = strlen(orig);
    size_t rep_len = strlen(rep);
    // 3. 在循环中中,使用strstr函数查找orig在p指向的位置开始之后第一次出现的位置、
    while ((p = strstr(p, orig))) {
        // 如果找到了,则将该位置之前的部分拷贝到buffer中,
        strncpy(buffer, str, p - str);
        buffer[p - str] = '\0';
        // 并使用sprintf函数将替换后的新子串和剩余字符串拼接起来,
        sprintf(buffer + (p - str), "%s%s", rep, p + orig_len);
        // 最后再将结果拷贝回原始字符串中。
        strcpy(str, buffer);
        // 4.更新指针p的位置,使其指向新的字符串中下一个需要替换的子串之后的位置,
        // 并重复步3直到无法再找到需要替换的子由为止
        p = str + (p - str) + rep_len;
    }
}

int main() {
    char str[100] = "{app}/set/request/database/model/{app}";
    replace_all(str, "{app}", "myapp");
    printf("%s", str);
    return 0;
}

这种实现方式可以替换换所有出现的 app ,而不仅仅是第一个匹配的子串,但也需要注意,如果原始字符串str和替换后的字符串rep的总长度超过了buffer的大小(4096),则会导致缓冲区溢出的问题,因此在实际使用时,可能需要根据具体情况修改bufer的大小或者采用其他更加安全的方式来进行字符串替换操作。

C++实现方式

#include <iostream>
#include <string>

// 原始字符串str、需要替换的子串orig和替换成的子串rep。
void replace_str(std::string& str, const std::string& orig, const std::string& rep) {
	size_t pos = 0;
	// 调用字符串的find函数来查找orig在str中的位置,
    while ((pos = str.find(orig, pos)) != std::string::npos) {
    	// 如果找到了,则使用replace函数将找到的orig替换为rep。
        str.replace(pos, orig.length(), rep);
        // 然后更新pos变量,继续在更新后的字符串中查找下一个orig出现的位置,并重复替换操作,
    	// 直到无法再找到orig为止。最终返回替换完成后的字符串。
 		pos += rep.length();
    }
}

int main() {
    std::string str = "{app}/set/request/database/model/{app}";
    replace_str(str, "{app}", "myapp");
    std::cout << str << std::endl;

    return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

替换字符串中出现的某段字符串的C语言和C++实现方式 的相关文章

随机推荐

  • QT信号槽原理(一)connect函数

    目录 2个类型和1个签名 Qt ConnectionType QMetaMethod MethodType 方法签名 connect函数源码解析 函数原型 第一步 参数检查 第二步 获取信号和槽的index 第三步 检查信号和槽的参数是否匹
  • Opencv之图像固定阈值二值化处理threshold

    目录 一 图像二值化 二 threshold 三 代码 一 图像二值化 定义 图像的二值化 就是将图像上的像素点的灰度值设置为0或255 也就是将整个图像呈现出明显的只有黑和白的视觉效果 灰度值0 黑 灰度值255 白 一幅图像包括目标物体
  • Cygwin编译JNI的环境配置

    一 什么是NDK NDK提供了一系列的工具 帮助开发者快速开发C 或C 的动态库 并能自动将so和java应用一起打包成apk 这些工具对开发者的帮助是巨大的 NDK 集成了交叉编译器 并提供了相应的mk文件隔离CPU 平台 ABI 等差异
  • MacBook怎么安装使用Windows软件和虚拟机?

    作为一名MacBook用户 你可能会发现有些软件和应用程序只适用于Windows操作系统 但别担心 今天我们将介绍两种方法 让你的MacBook轻松安装Windows软件和运行Windows虚拟机 为你的工作 学习和娱乐任务带来更多可能性
  • Vue 3 使用 vue-echarts 的柱状图 barItem 和 x, y 轴点击事件实现

    需求背景 最近使用 Vue 3 开发柱状图功能 图表已经绘制完成了 但是突然有需求加进来要可以点击柱状图的柱子 barItem 和 x y 轴的坐标 然后根据点击的位置 处理不同区域的点击事件 作为 CV 程序员 第一时间搜索网上的解决方案
  • 抖音养号步骤有哪些?最重要的3步你做到了吗?

    国仁网络资讯 为大家整理一份超详细的 短视频运营手册 回复私信限时免费领取 有人问我 新手养号怎么养 老账号养号要怎么养 其实 严格来说 养号不分新老 不管你是刚注册的抖音号 还是已经用过很久的抖音号 养号都是运营账号必做的事项之一 那么
  • C++文件的读取详解,以及使用eof出现末行数据被读取两次情况

    目录 0 前言 对文件流的读写 文件打开方式 1 写文本文件 2 读文本文档 2 1使用efo函数判断出现数据被读取两次 3 二进制方式写文件 4 二进制读文件 5 按指定格式读写数据stringstream 0 前言 对文件流的读写 if
  • text/html & text/plain的区别

    需要了解的概念 Content Type 用于定义用户的浏览器或相关设备如何显示将要加载的数据 或者如何处理将要加载的数据 MIME MIME类型就是设定某种扩展名的文件用一种应用程序来打开的方式类型 当该扩展名文件被访问的时候 浏览器会自
  • Red Hat Enterprise Linux 7.9 下载

    1 Red Hat Linux 所有版本 5 6 7 8 9 下载 https pan baidu com s 1eSYuljc2Bt9OXZmWdZQ96A 提取码 cqfu 推荐 https pan baidu com s 1RISly
  • c#:委托与回调函数示例

    c 委托与回调函数示例 上一篇文章已经给大家详细讲解过委托的意思 如何声明定义 如何通过委托调用函数 以及委托中的多播等 今天是刚刚学到委托新的用法 可以将方法当作参数来传递 并且不需用示例委托 所以今天来给大家再次拿出来详细讲解一下 一
  • Spring Boot日志配置logback

    目录 一 logback介绍 1 logback定义 2 logback启动加载文件 3 pom依赖 3 日志级别 二 配置文件详解 1 configuration 2 property 3 springProperty 4 logger
  • Flutter 自定义marquee垂直滚动

    自定义垂直marquee插件 用来向上垂直滚动列表 一般滚动公告 自定义类 import dart async import package flutter material dart class Marquee extends State
  • mongodb的sharding(分片)横向扩容的方法

    sharding是mongodb进行横向扩容的方法 sharding把一个集合的不同部分存储到不同的机器上 当一个数据库集合变得很大时 你只需要加入新的机器即可 sharding自动把集合的数据分布到新的服务器上 sharding自动实现数
  • uni-app小程序中v-show与display:flex一起使用时v-show不生效!

    问题 同时使用v show与display flex的时候 发现v show不能隐藏元素 原因 经排查原因后发现是因为display flex样式的优先级高于了v show中的display none 解决办法 display flex不要
  • xpah的使用

    目录 基本介绍 基本使用 案例 基本介绍 为什么要学习xpath scrapy框架支持xpath提取 selenium 经常使用xpath提取 使用简洁 语法稍稍复杂 xpath是什么 全称 xml path language 从xml中提
  • Jackson快速入门

    Java生态圈中有很多处理JSON和XML格式化的类库 Jackson是其中比较著名的一个 虽然JDK自带了XML处理类库 但是相对来说比较低级 使用本文介绍的Jackson等高级类库处理起来会方便很多 引入类库 由于Jackson相关类库
  • How to use jupyterlab in Ubuntu 22.04

    How to use jupyterlab in Ubuntu 22 04 Install Start Stop Install lwk qwfys pip install jupyterlab upgrade i http mirrors
  • matplotlib中颜色映射的使用

    matplotlib3 3中使用颜色映射 问题描述 在Python编程从入门到实践一书中15 2 8节 按照书中代码 在python3 8与matplotlib3 3中 camp plt cm Blues报错 解决 搜索发现应将此处语法改为
  • WDS桥接副路由器有线上网方法

    副路由器DHCP一定要关闭 或者IP池设置的范围不能包括有线设备IP
  • 替换字符串中出现的某段字符串的C语言和C++实现方式

    C语言实现方式 使用了循坏来重复替换操作 直到无法再找到需要替换的子串为止 具体实现如下 include