当前位置: 首页 > news >正文

C++字符串操作【超详细】

零.前言

本文将重点围绕C++的字符串来展开描述。

其中,对于C/C++中字符串的一些区别也做出了回答,并对于C++的(string库)进行了讲解,最后我们给出字符串的不同表达形式

开发环境

VS2022

一.字符串常量跟字符串变量

1.1字符串常量

字符常量是什么呢?顾名思义就是一段已经在内存中确定下来的字符串,并且这块内存中的字符串无法改变。

例如:"ABC"、"ASD233"、"sdasd16.."等等都是字符串常量

在C++中使用:

#include<iostream>
using namespace std;int main()
{cout << "abc" << "是一个字符串常量" << endl;	//abc是一个字符串常量
}

1.2字符串变量:

对于字符串变量,在C++中有三种实现方式:“数组”、“指针变量”、“string类对象”。

数组:

#include<iostream>
using namespace std;int main()
{char eg1[10] = "abc";    //直接初始化char eg2[10];    //后面通过输入初始化cin >> eg2;	//此处输入defcout << eg1 << endl;	//abccout << eg2 << endl;	//def
}

运行结果:

指针变量:

#include<iostream>
using namespace std;int main()
{char eg1[10] = "abc";	//数组char *eg2 = eg1;		//指针变量cout << eg1 << endl;	//abccout << eg2 << endl;	//abc
}

运行结果:

string类对象:

#include<iostream>
#include<string>
using namespace std;int main()
{string s1 = "123";	//利用“=”来初始化string s2("456");	//利用“()”来初始化,和上面本质一样string s3 = s1;		//利用“string”类对象来初始化string s4(s2);		//和上面本质一样char eg[10] = "abc";string s5 = eg;		//利用“eg数组”来初始化cout << s1 << endl;	//123cout << s2 << endl;	//456cout << s3 << endl;	//123cout << s4 << endl;	//456cout << s5 << endl;	//abc
}

运行结果:

二.字符串的读取

为方便起见,后续的所有字符串都将以string类对象的形式进行讲解。

2.1cin函数

没啥好说的,最简单也是最开始学习到的读取函数,可以读取字符串,遇到“空格”、“回车”、“Tab”等制表格符号结束读取。

ps:不会读取空格,空格并不会被存储!!!

例如:

#include<string>
using namespace std;int main()
{string s;cin >> s;	//在这里输入ABCcout << s << endl;	//输出ABCcin >> s;	//在这里输入A B Ccout << s << endl;	//输出A
}

运行结果:

 2.2getline()函数

getline函数相对于cin函数最大的区别在于“getline可以读取空格,遇到回车才结束

getline()函数格式:

getline(cin,变量名)

例如:

#include<iostream>
#include<string>
using namespace std;int main()
{string s;getline(cin, s);	//这里输入A B C Dcout << s << endl;	//输出A B C D
}

运行结果:

2.3cin.getline()函数

cin.getline()函数可以理解为是getline()函数的“超集”。

getline函数读取的是“string流(字符串流)”。

cin.getline函数读取的是“iostream流(输入输出信息流)”。

cin.getline函数遇到“空格”也会读取,不过跟getline函数最大的区别是“cin.getline()”函数可以指定读取的字符个数!!

cin.getline()函数格式:

cin.getline(变量名,读取字符的个数,结束字符)

其中,前两个参数必须有,第三个参数可以没有,默认为'\0'

PS:"cin.getline()函数只能给'数组'形式的字符串使用,而getline()函数只能给'string类对象'形式的字符串使用"

例如:

#include<iostream>
#include<string>
using namespace std;int main()
{char s[10];cin.getline(s,3);	//输入ABCDcout << s << endl;	//输出AB,原因在于最后一个字符存储了'\0',因此把C挤掉了。
}

运行结果:

getline()cin.getline()错误示例

#include<iostream>
#include<string>
using namespace std;int main()
{char eg1[10];string eg2;cin.getline(eg2, 5);	//报错,cin.getline()函数只能给'数组'形式字符串使用getline(eg1);			//报错,getline()函数只能给'string类对象'形式字符串使用
}

三.string类对象的操作

3.1string类对象字符串拼接、比较操作

"+"、">"、"<"、">="、"<="、"!="、"=="等符号在string类对象中都是允许的,具体规则如下:

"+":

"+"被用于两个字符串对象相加(首尾拼接)

#include<iostream>
#include<string>
using namespace std;int main()
{string s1 = "ABC";string s2 = "DEF";cout << s1 + s2 << endl;	//输出ABCDEF
}

"=="、"!=":

"=="被用于比较两个字符串是否相等(区分大小写、区分位置)
 

#include<iostream>
#include<string>
using namespace std;int main()
{string s1 = "ABC";string s2 = "ABC";string s3 = "abc";string s4 = "CBA";if(s1 == s2)cout << "s1,s2两个相等" << endl;elsecout << "s1,s2两个不相等" << endl;//输出相等if(s1 == s3)cout << "s1,s3两个相等" << endl;elsecout << "s1,s3两个不相等" << endl;//输出不相等if(s1 == s4)cout << "s1,s4两个相等" << endl;elsecout << "s1,s4两个不相等" << endl;//输出不相等
}

运行结果:

"!="被用来比较两个字符串是否“不相等”(区分位置、区分大小写

道理和上面的"=="一样,在这里就不赘述了。

">"、"<"、">="、"<=":

这四个符号用来给字符串进行大小比较(依照字典序进行比较)

字典序:

a > b >c > ... > z > A > B > C > ... > Z

#include<iostream>
#include<string>
using namespace std;int main()
{string s1 = "aB";string s2 = "AB";if (s1 > s2)cout << "s1>s2" << endl;elsecout << "s1<s2" << endl;//输出s1>s2
}

ps:“按照字典序从第一个位置开始挨个比较

例如“bA”大于“Ba”,那是因为b在第一个位置并且大于B,尽管后面的A小于a,但那是第二个位置了。

位置的优先级 > 字典序的优先级

3.2string类对象常见函数

#include<iostream>
#include<string>
using namespace std;int main()
{string s = "ABC";cout << s.empty() << endl;	//判断s是否为空,为空返回Ture(1),不为空返回False(0)cout << s.length() << endl;	//计算s的字符串长度cout << s.size() << endl;	//同上cout << s[2] << endl;	//跟字符数组一样,利用下标索引访问字符串中某个字符cout << s[3] << endl;	//空字符也是存在的,这里就输出空字符'\0'//运行结果//033C'\0',其实这个空字符在cmd命令控制窗口中就是一个空白.
}

运行结果:

 3.3修改string类对象的操作

3.3.1insert函数->插入:

s.insert(pos,k):

在字符串s下标索引pos之前插入字符串k

#include<iostream>
#include<string>
using namespace std;int main()
{string s = "ABC";s.insert(2, "66");cout << s << endl;	//输出AB66C
}

 3.3.2erase函数->删除:

erase(pos,len):

删除从 pos 开始的 len 个字符(包括位置pos)。如果 len 省略,则删除 pos 开始的后面所有字符。

#include<iostream>
#include<string>
using namespace std;int main()
{string s = "ABCDEF";s.erase(2, 2);cout << s << endl;	//输出ABEF
}

3.3.3replace函数->替换:

s.replace(start,len,rp):

将字符串s中下标索引start开始共len个字符替换为字符串rp

其中,删除的字符数量可以和要替换的字符串rp长度不一致

#include<iostream>
#include<string>
using namespace std;int main()
{string s = "ABCD";s.replace(1, 2, "6666");cout << s << endl;	//输出A6666D
}

3.3.4find函数->查找:

s.find(st):

在字符串s中查找字符串st第一次出现的位置,返回下标索引。

#include<iostream>
#include<string>
using namespace std;int main()
{string s = "ABCDEFAB";cout << s.find("AB") << endl;	//输出0
}

 3.3.5rfind函数->查找:

s.rfind(st):

在字符串s中查找字符串st最后一次出现的位置,返回下标索引。

#include<iostream>
#include<string>
using namespace std;int main()
{string s = "ABCDEFAB";cout << s.rfind("AB") << endl;	//输出6
}

3.3.6reverse函数->反转字符串:

s.reverse(start,end):

将字符串s下标索引[start,end]之间的字符串反转

#include<iostream>
#include<string>
using namespace std;int main()
{string s = "ABCDEF";reverse(s.begin(), s.end());cout << s << endl;	//FEFCBA
}

3.3.7substr函数->截取字符串:

s.substr(pos,len):

将字符串s从下标索引pos开始连续截取len个长度的字符串。

#include<iostream>
#include<string>
using namespace std;int main()
{string s = "ABCDEF";string ss = s.substr(1, 3);cout << ss << endl;	//BCD
}

相关文章:

C++字符串操作【超详细】

零.前言 本文将重点围绕C的字符串来展开描述。 其中&#xff0c;对于C/C中字符串的一些区别也做出了回答&#xff0c;并对于C的&#xff08;string库&#xff09;进行了讲解&#xff0c;最后我们给出字符串的不同表达形式。 开发环境&#xff1a; VS2022 一.字符串常量跟字…...

Ps:画笔工具

画笔工具 Brush Tool是 Photoshop 中最常用的工具&#xff0c;可广泛地用于绘画与修饰工作之中。 快捷键&#xff1a;B ◆ ◆ ◆ 常用操作方法与技巧 1、熟练掌握画笔工具的操作对于使用其他工具也非常有益&#xff0c;因为 Photoshop 中许多与笔刷相关的工具有类似的选项和操…...

【鸿蒙 HarmonyOS 4.0】弹性布局(Flex)

一、介绍 弹性布局&#xff08;Flex&#xff09;提供更加有效的方式对容器中的子元素进行排列、对齐和分配剩余空间。容器默认存在主轴与交叉轴&#xff0c;子元素默认沿主轴排列&#xff0c;子元素在主轴方向的尺寸称为主轴尺寸&#xff0c;在交叉轴方向的尺寸称为交叉轴尺寸…...

Java 客户端向服务端上传文件(TCP通信)

一、实验内容 编写一个客户端向服务端上传文件的程序&#xff0c;要求使用TCP通信的的知识&#xff0c;完成将本地机器输入的路径下的文件上传到D盘中名称为upload的文件夹中。并把客户端的IP地址加上count标识作为上传后文件的文件名&#xff0c;即IP&#xff08;count&#…...

问题:前端获取long型数值精度丢失,后面几位都为0

文章目录 问题分析解决 问题 通过接口获取到的数据和 Postman 获取到的数据不一样&#xff0c;仔细看 data 的第17位之后 分析 该字段类型是long类型问题&#xff1a;前端接收到数据后&#xff0c;发现精度丢失&#xff0c;当返回的结果超过17位的时候&#xff0c;后面的全…...

Day26:安全开发-PHP应用模版引用Smarty渲染MVC模型数据联动RCE安全

目录 新闻列表 自写模版引用 Smarty模版引用 代码RCE安全测试 思维导图 PHP知识点&#xff1a; 功能&#xff1a;新闻列表&#xff0c;会员中心&#xff0c;资源下载&#xff0c;留言版&#xff0c;后台模块&#xff0c;模版引用&#xff0c;框架开发等 技术&#xff1a;输…...

LVS集群(Linux Virtual server)介绍----及LVS的NAT模式部署(一)

群集的含义 ●Cluster&#xff0c;集群、群集由多台主机构成&#xff0c;但对外只表现为一个整体&#xff0c;只提供访问入口(域名或IP地址)&#xff0c;相当于一台大型计算机 问题&#xff1a; 互联网应用中&#xff0c;随着站点对硬件性能、响应速度、服务稳定性、数据可靠…...

海外媒体宣发套餐如何利用3种方式洞察市场-华媒舍

在当今数字化时代&#xff0c;媒体宣发成为了企业推广产品和品牌的重要手段之一。其中&#xff0c;7FT媒体宣发套餐是一种常用而有效的宣传方式。本文将介绍这种媒体宣发套餐&#xff0c;以及如何利用它来洞察市场。 一、关键概念 在深入讨论7FT媒体宣发套餐之前&#xff0c;让…...

开发知识点-Apache Struts2框架

Apache Struts2 介绍S2-001S2CVE-2023-22530 介绍 Apache Struts2是一个基于MVC&#xff08;模型-视图-控制器&#xff09;设计模式的Web应用程序框架&#xff0c;它是Apache旗下的一个开源项目&#xff0c;并且是Struts1的下一代产品。Struts2是在Struts1和WebWork的技术基础…...

【Spring高级】第3讲 Bean的生命周期

目录 基本的生命周期后处理器总结 基本的生命周期 为了演示生命周期的过程&#xff0c;我们直接使用 SpringApplication.run()方法&#xff0c;他会直接诶返回一个容器对象。 import org.springframework.boot.SpringApplication; import org.springframework.context.Config…...

【C语言】linux内核tcp_write_xmit和tcp_write_queue_purge

tcp_write_xmit 一、讲解 这个函数 tcp_write_xmit 是Linux内核TCP协议栈中的一部分&#xff0c;其基本作用是发送数据包到网络。这个函数会根据不同情况推进发送队列的头部&#xff0c;确保只要远程窗口有空间&#xff0c;就可以发送数据。 下面是对该函数的一些主要逻辑的中…...

opencv实现视频人脸识别

一. 实现指定图像的人脸识别 注意&#xff1a; 以下实例参考《OpenCV轻松入门面向Python》李立宗著&#xff0c;使用python语言&#xff0c;编辑器为PyCharm&#xff0c;且都运行成功。 1.dface3.jpg图片文件和当前代码放在同一级目录下。 2.级联分类器文件和当前代码文件放在…...

【今日面经】24/3/9 广州Java某小厂电话面经

面经来源&#xff1a;https://www.nowcoder.com/?type818_1 目录 1、 和equals()有什么区别&#xff1f;2、String变量直接赋值和构造函数赋值比较相等吗&#xff1f;3、String一些方法&#xff1f;4、抽象类和接口有什么区别&#xff1f;5、Java容器有哪些&#xff1f;6、Lis…...

日期问题---算法精讲

前言 今天讲讲日期问题&#xff0c;所谓日期问题&#xff0c;在蓝桥杯中出现众多&#xff0c;但是解法比较固定。 一般有判断日期合法性&#xff0c;判断是否闰年&#xff0c;判断日期的特殊形式&#xff08;回文或abababab型等&#xff09; 目录 例题 题2 题三 总结 …...

倒计时35天

dp预备(来源&#xff1a;b站acm刘春英老师) 1. 2. 3. 4. 5. 6. 7....

JAVA后端开发面试基础知识(七)——多线程

1. 线程池原理 优点 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线…...

Apache的安装与目录结构详细解说

1. Apache安装步骤 Apache是一款开源的Web服务器软件&#xff0c;常用于搭建网站和服务。以下是Apache的安装步骤&#xff1a; 在官方网站&#xff08;https://httpd.apache.org/&#xff09;下载最新版本的Apache软件包。解压下载的软件包到指定目录。运行安装程序&#xff…...

axios的详细使用

目录 axios&#xff1a;现代前端开发的HTTP客户端王者 一、axios简介 二、axios的基本用法 1. 安装axios 2. 发起GET请求 3. 发起POST请求 三、axios的高级特性 1. 拦截器 2. 取消请求 3. 自动转换JSON数据 四、axios在前端开发中的应用 五、总结 axios&#xff1a…...

空间复杂度的OJ练习——轮转数组

旋转数组OJ链接&#xff1a;https://leetcode-cn.com/problems/rotate-array/ 题目&#xff1a; 思路&#xff1a; 通过题目我们可以知道这是一个无序数组&#xff0c;只需要将数组中的数按给定条件重新排列&#xff0c;因此我们可以想到以下几种方法&#xff1a; 1.暴力求解法…...

学习与学习理论 - 2024教招 - test

一 方向 所有学习理论大的观点&#xff0c;到某个人物个人的观点。抖音&#xff1a;按照粉丝数量、收藏数量、点赞数量排名从编程&#xff08;思想&#xff09;、java、自己所拥有的特点看学习方法顺序&#xff1a;java、自身、教学理论的总观点、教学理论代表人物的观点、散兵…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

前端导出带有合并单元格的列表

// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

MySQL用户和授权

开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务&#xff1a; test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败&#xff0c;具体原因是客户端发送了密码认证请求&#xff0c;但Redis服务器未设置密码 1.为Redis设置密码&#xff08;匹配客户端配置&#xff09; 步骤&#xff1a; 1&#xff09;.修…...

无人机侦测与反制技术的进展与应用

国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机&#xff08;无人驾驶飞行器&#xff0c;UAV&#xff09;技术的快速发展&#xff0c;其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统&#xff0c;无人机的“黑飞”&…...

Go 并发编程基础:通道(Channel)的使用

在 Go 中&#xff0c;Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式&#xff0c;用于在多个 Goroutine 之间传递数据&#xff0c;从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...

嵌入式常见 CPU 架构

架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集&#xff0c;单周期执行&#xff1b;低功耗、CIP 独立外设&#xff1b;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel&#xff08;原始…...

LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用

中达瑞和自2005年成立以来&#xff0c;一直在光谱成像领域深度钻研和发展&#xff0c;始终致力于研发高性能、高可靠性的光谱成像相机&#xff0c;为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...

自然语言处理——文本分类

文本分类 传统机器学习方法文本表示向量空间模型 特征选择文档频率互信息信息增益&#xff08;IG&#xff09; 分类器设计贝叶斯理论&#xff1a;线性判别函数 文本分类性能评估P-R曲线ROC曲线 将文本文档或句子分类为预定义的类或类别&#xff0c; 有单标签多类别文本分类和多…...

AD学习(3)

1 PCB封装元素组成及简单的PCB封装创建 封装的组成部分&#xff1a; &#xff08;1&#xff09;PCB焊盘&#xff1a;表层的铜 &#xff0c;top层的铜 &#xff08;2&#xff09;管脚序号&#xff1a;用来关联原理图中的管脚的序号&#xff0c;原理图的序号需要和PCB封装一一…...