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的字符串来展开描述。 其中,对于C/C中字符串的一些区别也做出了回答,并对于C的(string库)进行了讲解,最后我们给出字符串的不同表达形式。 开发环境: VS2022 一.字符串常量跟字…...
Ps:画笔工具
画笔工具 Brush Tool是 Photoshop 中最常用的工具,可广泛地用于绘画与修饰工作之中。 快捷键:B ◆ ◆ ◆ 常用操作方法与技巧 1、熟练掌握画笔工具的操作对于使用其他工具也非常有益,因为 Photoshop 中许多与笔刷相关的工具有类似的选项和操…...
【鸿蒙 HarmonyOS 4.0】弹性布局(Flex)
一、介绍 弹性布局(Flex)提供更加有效的方式对容器中的子元素进行排列、对齐和分配剩余空间。容器默认存在主轴与交叉轴,子元素默认沿主轴排列,子元素在主轴方向的尺寸称为主轴尺寸,在交叉轴方向的尺寸称为交叉轴尺寸…...
Java 客户端向服务端上传文件(TCP通信)
一、实验内容 编写一个客户端向服务端上传文件的程序,要求使用TCP通信的的知识,完成将本地机器输入的路径下的文件上传到D盘中名称为upload的文件夹中。并把客户端的IP地址加上count标识作为上传后文件的文件名,即IP(count&#…...
问题:前端获取long型数值精度丢失,后面几位都为0
文章目录 问题分析解决 问题 通过接口获取到的数据和 Postman 获取到的数据不一样,仔细看 data 的第17位之后 分析 该字段类型是long类型问题:前端接收到数据后,发现精度丢失,当返回的结果超过17位的时候,后面的全…...
Day26:安全开发-PHP应用模版引用Smarty渲染MVC模型数据联动RCE安全
目录 新闻列表 自写模版引用 Smarty模版引用 代码RCE安全测试 思维导图 PHP知识点: 功能:新闻列表,会员中心,资源下载,留言版,后台模块,模版引用,框架开发等 技术:输…...
LVS集群(Linux Virtual server)介绍----及LVS的NAT模式部署(一)
群集的含义 ●Cluster,集群、群集由多台主机构成,但对外只表现为一个整体,只提供访问入口(域名或IP地址),相当于一台大型计算机 问题: 互联网应用中,随着站点对硬件性能、响应速度、服务稳定性、数据可靠…...
海外媒体宣发套餐如何利用3种方式洞察市场-华媒舍
在当今数字化时代,媒体宣发成为了企业推广产品和品牌的重要手段之一。其中,7FT媒体宣发套餐是一种常用而有效的宣传方式。本文将介绍这种媒体宣发套餐,以及如何利用它来洞察市场。 一、关键概念 在深入讨论7FT媒体宣发套餐之前,让…...
开发知识点-Apache Struts2框架
Apache Struts2 介绍S2-001S2CVE-2023-22530 介绍 Apache Struts2是一个基于MVC(模型-视图-控制器)设计模式的Web应用程序框架,它是Apache旗下的一个开源项目,并且是Struts1的下一代产品。Struts2是在Struts1和WebWork的技术基础…...
【Spring高级】第3讲 Bean的生命周期
目录 基本的生命周期后处理器总结 基本的生命周期 为了演示生命周期的过程,我们直接使用 SpringApplication.run()方法,他会直接诶返回一个容器对象。 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协议栈中的一部分,其基本作用是发送数据包到网络。这个函数会根据不同情况推进发送队列的头部,确保只要远程窗口有空间,就可以发送数据。 下面是对该函数的一些主要逻辑的中…...
opencv实现视频人脸识别
一. 实现指定图像的人脸识别 注意: 以下实例参考《OpenCV轻松入门面向Python》李立宗著,使用python语言,编辑器为PyCharm,且都运行成功。 1.dface3.jpg图片文件和当前代码放在同一级目录下。 2.级联分类器文件和当前代码文件放在…...
【今日面经】24/3/9 广州Java某小厂电话面经
面经来源:https://www.nowcoder.com/?type818_1 目录 1、 和equals()有什么区别?2、String变量直接赋值和构造函数赋值比较相等吗?3、String一些方法?4、抽象类和接口有什么区别?5、Java容器有哪些?6、Lis…...
日期问题---算法精讲
前言 今天讲讲日期问题,所谓日期问题,在蓝桥杯中出现众多,但是解法比较固定。 一般有判断日期合法性,判断是否闰年,判断日期的特殊形式(回文或abababab型等) 目录 例题 题2 题三 总结 …...
倒计时35天
dp预备(来源:b站acm刘春英老师) 1. 2. 3. 4. 5. 6. 7....
JAVA后端开发面试基础知识(七)——多线程
1. 线程池原理 优点 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线…...
Apache的安装与目录结构详细解说
1. Apache安装步骤 Apache是一款开源的Web服务器软件,常用于搭建网站和服务。以下是Apache的安装步骤: 在官方网站(https://httpd.apache.org/)下载最新版本的Apache软件包。解压下载的软件包到指定目录。运行安装程序ÿ…...
axios的详细使用
目录 axios:现代前端开发的HTTP客户端王者 一、axios简介 二、axios的基本用法 1. 安装axios 2. 发起GET请求 3. 发起POST请求 三、axios的高级特性 1. 拦截器 2. 取消请求 3. 自动转换JSON数据 四、axios在前端开发中的应用 五、总结 axios:…...
空间复杂度的OJ练习——轮转数组
旋转数组OJ链接:https://leetcode-cn.com/problems/rotate-array/ 题目: 思路: 通过题目我们可以知道这是一个无序数组,只需要将数组中的数按给定条件重新排列,因此我们可以想到以下几种方法: 1.暴力求解法…...
学习与学习理论 - 2024教招 - test
一 方向 所有学习理论大的观点,到某个人物个人的观点。抖音:按照粉丝数量、收藏数量、点赞数量排名从编程(思想)、java、自己所拥有的特点看学习方法顺序:java、自身、教学理论的总观点、教学理论代表人物的观点、散兵…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...
接口自动化测试:HttpRunner基础
相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型…...
数据结构第5章:树和二叉树完全指南(自整理详细图文笔记)
名人说:莫道桑榆晚,为霞尚满天。——刘禹锡(刘梦得,诗豪) 原创笔记:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 上一篇:《数据结构第4章 数组和广义表》…...
虚幻基础:角色旋转
能帮到你的话,就给个赞吧 😘 文章目录 移动组件使用控制器所需旋转:组件 使用 控制器旋转将旋转朝向运动:组件 使用 移动方向旋转 控制器旋转和移动旋转 缺点移动旋转:必须移动才能旋转,不移动不旋转控制器…...

