第5天----单词替换(C++replace()函数)

news2024/9/19 11:10:14

当一句话中出现错误的单词时,你是否想快速将它替换为你想要的,接下来的这篇文章,将带你了解什么是单词替换。
在这里插入图片描述


一、基本知识:

1. string::replace()函数

C++ <string>库中的replace()函数是用于替换字符串中的特定字符或子字符串的函数。它的语法如下:

string replace (size_t pos, size_t len, const string& str);
  • 其中,pos是要替换的起始位置,len是要替换的字符或子字符串的长度,str是用于替换的字符串。(这三者也可以自己指定)

  • 该函数会将原始字符串中从pos位置开始的len个字符或子字符串替换为str,并返回替换后的字符串。

下面是一个使用replace()函数的示例:

#include <iostream>
#include <string>

int main() {
    std::string str = "Hello, world!";
    std::cout << "原始字符串:" << str << std::endl;

    // 将字符串中的"world"替换为"everyone"
    str.replace(str.find("world"), 5, "everyone");
    std::cout << "替换后的字符串:" << str << std::endl;

    return 0;
}

输出结果为:

原始字符串:Hello, world!
替换后的字符串:Hello, everyone!
  • 在上面的示例中,我们使用find()函数找到了字符串中"world"的起始位置,并将其替换为"everyone"

二、小试牛刀:

题目描述:

输入一个字符串,以回车结束(字符串长度<=200)。该字符串由若干个单词组成,单词之间用一个空格隔开,所有单词区分大小写。现需要将其中的某个单词替换成另一个单词,并输出替换之后的字符串。

输入格式

1 1 1 行是包含多个单词的字符串 s s s

2 2 2 行是待替换的单词 a ( a( a( 长度<=100);

3 3 3 行是 a a a 将被替换的单词 b ( b( b( 长度 <=100)。

s , a , b s,a,b s,a,b 最前面和最后面都没有空格。

输出格式

输出只有 1 1 1 行,将 s s s 中所有单词 a a a 替换成 b b b 之后的字符串。

样例

样例输入

You want someone to help you
You
I

样例输出

I want someone to help you
  • 题意并不难懂,在分析之前,我先给出我的解法。
#include<iostream>
#include<string>
using namespace std;

string  s,s1,s2;
int main(void)
{
	getline(cin, s);
	cin >> s1;
	cin >> s2;
	int len = s.length();
	size_t index=s.find(s1); 
	while(index!=string::npos)
	{
		s.replace(index, s1.length(), s2);
		index = s.find(s1, index + s2.length());		
	}
	cout << s;
	return 0;
}
  1. 首先我利用getline()读入整行句子s,然后读入s1,s2;
  2. 再利用string::find()函数循环查找该句子中是否存在目标单词,若有则立即替换,并且将下次的查找起始点更改为该处替换后单词的末尾。(do-while())。

我的解题历程:

  • 怎么样,是不是很简便?其实单词替换的本质还是单词的查找,这在前面我们就已经讲过,当目标单词找到后,即可替换。说来还算轻巧,但第一次做的时候可不容易:
    1️⃣刚开始是我想的是开一个vector来存储每个string字符串,然后在前n-2个单词中查找是否存在第n-1个单词,如果有,则用第n个单词将其替换;
    2️⃣然后遍历输出前n-2个单词即可。
  • 但问题来了,这样我怎么判断输入结束了呢❓
  • 每次输入一个string字符串,由于单词数目没有固定,所有有点难处理。但看看题目,说句子长度最多200个字符,那么最多可能有100个单词,再加上两个输入,或许可以利用其上限102开一个while()循环,在循环里指定条件,当s.length()>0时,再存储到vector中,虽然这样是可以的,但是平白无故地消耗了一些时间复杂度,并且这样做的空间复杂度也较大,所以到这里就果断舍弃这种思路,开始寻找其他的解决办法。
  • 后来我又想,要不开一个字符数组char[],利用fgets()函数读入一整行单词,这样似乎可以…再利用strstr()函数(C语言)循环查找就可以了,不过替换有点麻烦,可惜substr()是C++中定义的替换函数,可以直接替换某部分字符串(前面几节讲过),所以这样替换的效率也不高…权衡利弊之下,我只好选择了一种输入操作简便,替换效率又高的做法😄

三、其他解法:

另解1:

  • 题意:将一行字符串中的某个单词替换成指定单词(被替换的单词可能有多个)。

  • 解题提示:

    1. 不必要一个个字符读入,可以整体将某个单词读入,方便判断和输出。
    2. 可以创建一个字符串类型的数组存输入的每个单词。
    3. 在输入的时候可以顺便统计单词的个数。
  • 最后只要判断数组中每个单词是不是要替换的单词,如果是,输出想要替换的单词,不是就直接输出。

下面是代码:

#include<iostream>
#include<string>
using namespace std;
string a[105];
int main(){
	string s;
	int n=0;
	while(cin>>s) a[++n]=s;//a[++n]=s;等同于n++;a[n]=s;
	for(int i=1;i<=n-2;i++){//注意,读入的时候将想被替换的单词放在了 n-1 的位置,替换的单词放在了 n 的位置,所以循环一直到 n-2 即可。
		if(a[i]==a[n-1]) cout<<a[n]<<" ";//判断到要被替换的单词就输出替换它的单词。
		else cout<<a[i]<<" ";
	}
	return 0;
}
  • 这个其实就是我上面所说的循环输入的方法,在编译器中是无法确定是否输入完毕的,但的确也是一种方法,一般的评测平台都不会报错。

另解2:

  • 这道题可以直接一个一个比对,如果单词与 a 相同就输出 b,否则输出原单词。

  • 题目是让我们把一个单词替换成另一个单词,也就是字符串,并不是单个字符的替换,所以我们不妨试试字符数组。这里可以用 while 进行输入,不过这样就需要先将第一个单词输入;用do while其实也可以,并且不用先输入第一个单词

  • 我们将单词a替换成单词b时可以把单词b装住,也可以直接输出,但我用的是装住的方法,输出时记得加空格。如果用直接输出的也行,也一定要加空格!

  • 最后逐个输出即可,代码如下:

#include<bits/stdc++.h>//万能头~ 
using namespace std;
string a,b;//定义单词a和单词b 
string s[105]; 
//定义含多个单词的字符串,因为这里要替换的不是一个字符,而是一个字符串,所以我们可以用字符串数组~ (是一个不错的选择) 
int len=1;
int main()
{
	 cin>>s[1];//因为我们用的是while输入,所以我们要先将第一个单词输进来~ 
    while(getchar() == ' ')
        cin>>s[++len];//因为我们用的是字符串数组,所以我们要用while输入 
    cin>>a>>b;//这里不用解释了吧 
    for(int i=1;i<=len;i++) 
    {
    	if(s[i]==a) s[i]=b;//判断这个单词是否是单词a,是的话就把这个单词变成单词b 
    	cout<<s[i]<<" ";//输出,注:记得加空格!!! 
    }
	return 0;
}

今天的讲解就到这里了,相信你也是收获满满吧!
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微信小程序canvas type=2d生成海报保存到相册、文字换行溢出显示...、文字删除线、分享面板

做个简单的生成二维码海报分享&#xff0c;我做的时候也找简单的方法看能不能实现页面直接截图那种生成图片&#xff0c;原生小程序不支持&#xff0c;不多介绍下面有全部代码有注释、参数自行替换运行看看&#xff0c;有问题可以咨询我&#xff0c;我写的已经上线 效果如图&a…

CTFhub-sql-整数注入

判断存在 sqli 注入 1 1 and 11 1 and 12 因为 11 为真&#xff0c;12 为假&#xff0c;且 11 与 1 显示的数据一样&#xff0c;那么就存在 sqli 注入 查询该数据表的字段数量 一、 2 3 1,2成功带出数据&#xff0c;3没有数据&#xff0c;所以有两个字段 二、 1 order by …

数据结构---串(赋值,求子串,比较,定位)

目录 一.初始化 顺序表中串的存储 串的链式存储 二.赋值操作&#xff1a;将str赋值给S 链式表 顺序表 三.复制操作&#xff1a;将chars复制到str中 链式表 顺序表 四.判空操作 链式表 顺序表 五.清空操作 六.串联结 链式表 顺序表 七.求子串 链式表 顺序表…

Vue 2.x 项目升级到 Vue 3详细指南【修改清单】

文章目录 前言0.迁移过程1. 安装 Vue 32. 逐一处理迁移中的警告3. 迁移全局和内部 API4. 迁移 Vue Router 和 Vuex5. 处理其他的不兼容变更 1. Vue3特性1. Composition API2. 更好的性能3. 更好的 TypeScript 支持4. 多个根元素5. Suspense 组件6. Teleport 组件7. 全局 API 的…

python 打印人口分布金字塔图

背景 今天介绍一个不使用 matplot&#xff0c;通过DebugInfo模块打印人口金字塔图的方法。 引入模块 pip install DebugInfo打印人口金字塔图 下面的代码构建了两个人口数据&#xff08;仅做功能演示&#xff0c;不承诺任何参考价值&#xff09;&#xff0c;男性人口和女性…

基础论文学习(4)——CLIP

《Learning Transferable Visual Models From Natural Language Supervision》 CLIP的英文全称是Contrastive Language-Image Pre-training&#xff0c;即一种基于对比文本-图像对的预训练模型。CLIP是一种基于对比学习的多模态模型&#xff0c;与CV中的一些对比学习方法如moc…

软考高级架构师下篇-12层次式架构设计理论与实践

目录 1. 考情分析2. 层次式体系结构概述3. 表现层框架设计4. 中间层框架设计5. 数据访问层设计6. 数据架构规划与设计7. 物联网层次架构设计7. 前文回顾1. 考情分析 根据考试大纲,层次式架构设计理论与实践知识点会涉及单选题型(约占2~5分)和案例题(25分),本小时内容偏重于方…

lesson9: C++多线程

1.线程库 1.1 thread类的简单介绍 C11 中引入了对 线程的支持 了&#xff0c;使得 C 在 并行编程时 不需要依赖第三方库 而且在原子操作中还引入了 原子类 的概念。要使用标准库中的线程&#xff0c;必须包含 < thread > 头文件 函数名 功能 thread() 构造一个线程对象…

LCD液晶屏接口静电浪涌保护用TVS/ESD二极管,如何选型?

LCD 液晶屏是Liquid Crystal Display 的简称&#xff0c;指将玻璃和LCD驱动器集成到一起的LCD显示产品&#xff0c;为用户提供了一个标准的LCD显示驱动接口&#xff0c;用户可以按照接口&#xff08;有4位、8位、VGA等不同类型&#xff09;要求进行操作来控制LCD正确显示。众所…

Fsm onehot

module top_module(input in,input [9:0] state,output [9:0] next_state,output out1,output out2);assign out1(state[8]|state[9])?1:0;assign out2(state[9]|state[7])?1:0;assign next_state[0](state[0]&(~in)) |(state[1]&(~in)) |(state[2]&(~in)) |(sta…

LVS+Keepalived 实验

Keepalived 是什么 Keepalived 是一个基于VRRP协议来实现的LVS服务高可用方案&#xff0c;可以解决静态路由出现的单点故障问题的一款检查工具 在一个LVS服务集群中通常有主服务器&#xff08;MASTER&#xff09;和备份服务器&#xff08;BACKUP&#xff09;两种角色的服务器…

ShardingSphere01-docker环境安装

使用docker安装数据库是一个非常好的选择&#xff0c;后续的读写分离、数据分片等功能的数据库都是由docker创建。 一、安装准备 1、前提条件 Docker可以运行在Windows、Mac、CentOS、Ubuntu等操作系统上 Docker支持以下的CentOS版本&#xff1a; CentOS 7 (64-bit)CentOS …

LLM预训练大型语言模型Pre-training large language models

在上一个视频中&#xff0c;您被介绍到了生成性AI项目的生命周期。 如您所见&#xff0c;在您开始启动您的生成性AI应用的有趣部分之前&#xff0c;有几个步骤需要完成。一旦您确定了您的用例范围&#xff0c;并确定了您需要LLM在您的应用程序中的工作方式&#xff0c;您的下…

第59步 深度学习图像识别:误判病例分析(TensorFlow)

基于WIN10的64位系统演示 一、写在前面 本期内容对等于机器学习二分类系列的误判病例分析&#xff08;传送门&#xff09;。既然前面的数据可以这么分析&#xff0c;那么图形识别自然也可以。 本期以mobilenet_v2模型为例&#xff0c;因为它建模速度快。 同样&#xff0c;基…

Linux下Jenkins安装 (最新)

环境概述 随着软件开发需求及复杂度的不断提高&#xff0c;团队开发成员之间如何更好地协同工作以确保软件开发的质量已经慢慢成为开发过程中不可回避的问题。Jenkins自动化部署可以解决集成、测试、部署等重复性的工作&#xff0c;工具集成的效率明显高于人工操作&#xff1b…

Android动画进阶指北

原文链接 Android Animation Advanced Tricks 前面的文章介绍了动画的基本使用方法&#xff0c;本文来聊一聊涉及到动画的高级技巧&#xff0c;以及一些非常优质的学习资源和动画三方库和框架。 页面之间的过渡动画 常规的动画都是针对某一页面上的某个元素做动画&#xff0c…

3、Spring_容器执行

容器执行点 1.整合 druid 连接池 添加依赖 <dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.8</version> </dependency>1.硬编码方式整合 新建德鲁伊配置 <?xml version"1.…

微信小程序 车牌号输入组件

概述 一个小组件&#xff0c;用于方便用户输入车牌号码 详细 概述 有时候我们开发过程中会遇到需要用户输入车牌号的情况&#xff0c;让客户通过自带键盘输入&#xff0c;体验不好且容易出错&#xff0c;例如车牌号是不能输入O和I的&#xff0c;因此需要有一个自定义的键盘…

FPGA中锁存器(latch)、触发器(flip-flop)以及寄存器(register)详解

文章目录 1 定义1.1 锁存器&#xff08;latch&#xff09;1.2 触发器&#xff08;flip-flop&#xff09;1.3 寄存器&#xff08;register&#xff09; 2 比较2.1 锁存器&#xff08;Latch&#xff09;危害即产生原因2.2 寄存器和锁存器的区别2.3 锁存器和触发器的区别 3 结构3.…

dvwa环境搭建

靶场搭建 环境作用apache网站代理&#xff0c;部署网站php一种开源通用脚本语言&#xff0c;用来处理程序mysql数据库&#xff0c;用来存储数据 1.打开sever 2008&#xff0c;远程桌面连接&#xff0c;将文件拷贝到虚拟机&#xff0c;打开微软常用集合运行库&#xff0c;等待…