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
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt Creator常见问题解决方法

Qt Creator源文件重命名的正确方法 光改文件名是不够的&#xff0c;还要在.pro文件中的SOURCES中把名字改成之后的。 中文乱码&#xff08;字符集设置&#xff09; 菜单栏-工具-选项-设置为utf-8

使用R语言进行聚类分析

一、样本数据描述 城镇居民人均消费支出水平包括食品、衣着、居住、生活用品及服务、通信、文教娱乐、医疗保健和其他用品及服务支出这八项指标来描述。表中列出了2016年我国分地区的城镇居民的人均消费支出的原始数据&#xff0c;数据来源于2017年的《中国统计年鉴》&#xf…

试题 算法训练 强力党逗志芃

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述 逗志芃励志要成为强力党&#xff0c;所以他将身上所以的技能点都洗掉了重新学技能。现在我们可以了解到&#xff0c;每个技能…

【C++专栏】C++入门 | 函数重载、引用、内联函数

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;C专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ C入门 | 函数重载、引用、内联函数 文章编号&#xff1a;C入门 / 02 文…

appium2的一些配置

appium-desktop不再维护之后&#xff0c;需要使用appium2。 1、安装appium2 命令行输入npm i -g appium。安装之后输入appium或者appium-server即可启动appium 2、安装安卓/ios的驱动 安卓&#xff1a;appium driver install uiautomator2 iOS&#xff1a;appium driver i…

背包问题算法

背包问题算法 0-1背包问题二维数组一维数组 完全背包问题二维数组一维数组 多重背包问题一维数组 0-1背包问题 问题&#xff1a;背包的容量为9&#xff0c;有重量分别为[2, 4, 6, 9]的四个物品&#xff0c;价值分别为[3, 4, 5, 6]&#xff0c;求背包能装的物品的最大价值是多少…

【软件测试】接口测试工具APIpost

说实话&#xff0c;了解APIpost是因为&#xff0c;我的所有接口相关的文章下&#xff0c;都有该APIpost水军的评论&#xff0c;无非就是APIpost是中文版的postman&#xff0c;有多么多么好用&#xff0c;虽然咱也还不是什么啥网红&#xff0c;但是不知会一声就乱在评论区打广告…

二叉树遍历(前中后序的递归/非递归遍历、层序遍历)

二叉树的遍历 1. 二叉树的前序、中序、后序遍历 前、中、后序遍历又叫深度优先遍历 注&#xff1a;严格来说&#xff0c;深度优先遍历是先访问当前节点再继续递归访问&#xff0c;因此&#xff0c;只有前序遍历是严格意义上的深度优先遍历 首先需要知道下面几点&#xff1a; …

springMVC自定义类型转换

目录 &#x1f34b;&#x1f34a;自定义的转换类 &#x1f34b;&#x1f34a;xml文件中添加配置 &#x1f34b;&#x1f34a;测试 SpringMVC 底层已经封装了很多的类型转换器&#xff0c;也就是为什么我们页面上传的字符串可以使用 Integer接收或者可以直接转换为数组的原因…

手写简易操作系统(二)--启动计算机

前情提要 在上一部分的内容中&#xff0c;我们已经做好了模拟仿真的整个准备工作&#xff0c;这一节我们就先把计算机启动起来。 一、Bochs配置 1.1、配置启动盘 创建硬盘的工具是bximage&#xff0c;这个工具在我们的Bochs目录下&#xff0c;使用命令行创建硬盘 第一个选择…

华为新发布磁电存储“王炸”,到底是什么?

最近&#xff0c;在巴塞罗那举行的2024年世界移动通信大会&#xff08;MWC24&#xff09;上&#xff0c;华为数据存储产品线总裁周彼得博士介绍了这款即将面世的产品。他向听众表示&#xff0c;与磁带存储相比&#xff0c;该设备可以降低20%的总连接成本&#xff0c;而与硬盘相…

如何在Linux上为PyCharm创建和配置Desktop Entry

在Linux操作系统中&#xff0c;.desktop 文件是一种桌面条目文件&#xff0c;用于在图形用户界面中添加程序快捷方式。本文将指导您如何为PyCharm IDE创建和配置一个 .desktop 文件&#xff0c;从而能够通过应用程序菜单或桌面图标快速启动PyCharm。 步骤 1: 确定PyCharm安装路…