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、自身、教学理论的总观点、教学理论代表人物的观点、散兵…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...
从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
逻辑回归暴力训练预测金融欺诈
简述 「使用逻辑回归暴力预测金融欺诈,并不断增加特征维度持续测试」的做法,体现了一种逐步建模与迭代验证的实验思路,在金融欺诈检测中非常有价值,本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...
(一)单例模式
一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...
day36-多路IO复用
一、基本概念 (服务器多客户端模型) 定义:单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用:应用程序通常需要处理来自多条事件流中的事件,比如我现在用的电脑,需要同时处理键盘鼠标…...

