【探索C++】string类详解
- (꒪ꇴ꒪ ),Hello我是祐言QAQ
- 我的博客主页:C/C++语言,数据结构,Linux基础,ARM开发板,网络编程等领域UP🌍
- 快上🚘,一起学习,让我们成为一个强大的攻城狮!
- 送给自己和读者的一句鸡汤🤔:集中起来的意志可以击穿顽石!
- 作者水平很有限,如果发现错误,请在评论区指正,感谢🙏
在C++中,字符串处理是非常重要的一部分,而string
类是STL中封装的一个重要工具,用于处理字符串。它的强大功能在上上篇博客中有些许讲解,那么本文将介绍C++中字符串的基本概念以及string
类的构造方法,让你彻底理解和掌握C++中的string类。
一. C++中字符串的概念
在C++中,字符串是文本数据的重要形式,用于存储和处理文本信息。C++中,有多种方式来表示字符串,其中最常用的是使用string
类。掌握好string类对新手是及其重要的。
1.1 string
类
string
是C++标准模板库(STL)中封装的一个类,用于表示和操作字符串。它是对字符数组(char
数组)或字符指针(char *
)的封装,提供了一系列的成员函数(后文马上也会介绍到详细的常见成员用法等),简化了字符串的操作。
1.2 string
类的优势
与传统的字符数组或字符指针相比,string
类有以下优势:
-
内存管理:
string
类会自动管理字符串的内存,不需要手动释放内存或担心内存越界问题。 -
操作简便:
string
类提供了丰富的成员函数,使得字符串的操作变得更加简单和灵活。 -
安全性:由于内存管理由
string
类自动处理,可以减少许多常见的内存错误。
1.3 输入字符串
需要注意的是,如果使用 cin
来输入字符串,它会在遇到空格时停止输入。如果需要获取包含空格的输入,应使用getline
函数,如下所示:
string name;
getline(cin, name); // 通过getline获取包含空格的输入
getline函数的具体用法呢上一篇博客中也有详细介绍,感兴趣请翻阅查看。
二. string
字符串的构造
现在让我们来看一下如何构造string
字符串。
2.1 默认无参构造函数
string
类具有默认无参构造函数,可以用来创建一个空的字符串对象,如下所示:
string str; // 创建一个空的字符串对象
2.2 有参构造函数
string
类也提供了有参构造函数,用于根据给定的内容创建字符串对象。以下是一些示例:
- 使用字符串字面值创建字符串对象:
string str1("hello world"); // 使用字符串字面值创建字符串对象
string str2 = "hello world"; // 另一种方式
- 使用字符和重复次数创建字符串对象:
string str3(10, 'A'); // 创建包含10个'A'字符的字符串
2.3 拷贝构造函数
string
类还具有拷贝构造函数,可以通过复制已有的字符串对象来创建新的字符串对象,如下所示:
string str4 = str1; // 使用拷贝构造函数创建新的字符串对象
string str5(str2); // 另一种使用拷贝构造函数的方式
三. 重载运算符
学习C语言时大家肯定对重载没有太多印象,如果你能记起 & 是被重载的那么你的C语言是扎实的,它既可以是按位与操作符又是取地址操作符;那么在C++中,string
类重载了许多操作符,使得字符串的操作更加方便和灵活。下面我们将介绍一些常见的操作符重载函数。
3.1 赋值运算符(=)
赋值运算符(=
)被重载用于将一个字符串赋值给另一个字符串。例如:
string str1 = "hello world"; // 使用赋值运算符将一个字符串赋值给str1
string str2;
str6 = str1; // 使用赋值运算符将str4的值赋给str2
cout << "str2 = " << str2 << endl;
3.2 左移运算符(<<)
左移运算符(<<
)被重载用于将字符串输出到输出流,通常用于输出到控制台。例如:
string str1 = "hello world";
cout << "str1 = " << str1 << endl; // 使用左移运算符将str1输出到控制台
3.3 右移运算符(>>)
右移运算符(>>
)被重载用于从输入流中读取字符串。例如:
string str1;
cin >> str1; // 使用右移运算符从输入流中读取字符串
3.4 数组下标操作符([])
数组下标操作符([]
)被重载,使得可以通过下标访问字符串中的字符。例如:
string str1 = "hello world";
char c = str1[2]; // 使用数组下标操作符访问字符串的第三个字符(下标从0开始)
cout << "c = " << c << endl; // 输出 c = l
3.5 加法运算符(+)
加法运算符(+
)被重载用于将两个字符串连接起来。例如:
string str1 = "hello ";
string str2 = "world";
string str3;
str3 = str1 + str2; // 使用加法运算符连接两个字符串
3.6 加法赋值运算符(+=)
加法赋值运算符(+=
)被重载用于将一个字符串与另一个字符串连接并将结果赋值给原字符串。例如:
string str1 = "hello ";
string str2 = "world";
str1 += str2; // 使用加法赋值运算符连接并赋值
3.7 关系运算符(==、!=、<、>、<=、>=)
关系运算符(==
、!=
、<
、>
、<=
、>=
)被重载,用于比较两个字符串的大小关系。例如:
string str1 = "apple";
string str2 = "banana";
if (str1 < str2) {cout << "str1 小于 str2" << endl;
} else {cout << "str1 大于等于 str2" << endl;
}
注意:
只要你的类(stig字符串)里面,只要对运算符有做重载,你都可以直接去用这个运算符,如果没有,则会报以下这个错误:
no match for‘operator|’ //operator是关键,表示后面的这个运算符没有做重载
四、C++的string成员函数
之前的一篇博客已经详细的讲解了string
类强大的功能,那么今天我们来看看该类下到底有多少常用的成员函数,用于操作和处理字符串。
4.1 length()
或size()
返回字符串的长度,即字符的个数。
string str = "hello";
int len = str.length();// 或 int len = str.size();
4.2 empty()
检查字符串是否为空,返回true
表示为空,false
表示非空。
string str = "hello";
bool isEmpty = str.empty(); // 返回 false
4.3 clear()
清空字符串的内容,使其成为空字符串。
string str = "hello";
str.clear(); // str现在是一个空字符串
4.4
substr(start, length)
返回从指定位置开始的指定长度的子字符串。
string str = "hello world";
string sub = str.substr(6, 5); // sub = "world"
4.5 find(substring)
在字符串中查找子字符串,并返回第一次出现的位置(索引),如果未找到则返回string::npos
。
string str = "hello world";
size_t pos = str.find("world"); // pos = 6
4.6 replace(start, length, new_str)
用新字符串替换指定位置的子字符串。
string str = "hello world";
str.replace(6, 5, "there"); // str = "hello there"
4.7 append(new_str)
或+=
将新字符串追加到原字符串的末尾。
string str = "hello";
str.append(" world"); // str = "hello world"
// 或者
string str1 = "hello";
string str2 = " world";
str1 += str2; // str1 = "hello world"
4.8 insert(pos, new_str)
在指定位置插入新字符串。
string str = "hello";
str.insert(3, " there"); // str = "hello there"
4.9 erase(start, length)
删除指定位置的一段字符。
string str = "hello world";
str.erase(6, 5); // str = "hello "
4.10 compare(str2)
与另一个字符串比较,返回0表示相等,正数表示大于,负数表示小于。
string str1 = "apple";
string str2 = "banana";
int result = str1.compare(str2); // result < 0,因为"apple"小于"banana"
4.11 at()
获取字符串的单个字符。
string str1("hello");
string str2("world");
char c=str1.at(4); //获取下标为4的这个字符
cout <"c ="<c <endl;
str2.at(0)='h'; //更改第0个字符为'h'
cout <"str2 ="<str2 <endl;
4.12 assign()
字符串的赋值。
string str1("hello world");
string str2;
str2.assign(str1);
cout <"str2 ="<str2 <endl;string str3;
str3.assign(str1,0,5); //从0开始,赋值5个
cout <"str3 ="<str3 <endl;
4.13 swap()
字符串的交换。
string str1("hello");
string str2("world");
cout <"str1 ="<str1 <endl;
cout <"str2 ="<str2 <endl;
str1.swap(str2);
cout <"str1 ="<str1 <endl;
cout <"str2 ="<str2 <endl;
练习1:将字符串中所有的小写字母和大写字母颠倒并输出。
#include <iostream>
using namespace std;int main() {string str("Hello WorLD");// 遍历字符串中的每个字符for (int i = 0; i < str.length(); ++i) {// 如果字符是大写字母,将其转换为小写字母if (str[i] >= 'A' && str[i] <= 'Z') {str[i] += 32;}// 如果字符是小写字母,将其转换为大写字母else if (str[i] >= 'a' && str[i] <= 'z') {str[i] -= 32;}}cout << str << endl;return 0;
}
练习2:编写一个程序,去掉给定字符串中重复的字符,比如goooooogle => gole。
#include <iostream>
using namespace std;int main() {string str;cin >> str; // 从输入获取字符串,例如输入:gooooogle// 遍历字符串中的每个字符for (int i = 0; i < str.length(); ++i) {// 再次遍历字符串中的字符,从当前字符的下一个位置开始for (int j = i + 1; j < str.length(); ) {// 如果当前字符与后面的字符相同,就删除后面的字符if (str[i] == str[j]) {str.erase(j, 1); // 删除重复字符(假设删除字符的后一个还是这个字符)} else {++j;}}}cout << str << endl; // 输出移除重复字符后的字符串return 0;
}
更多C/C++语言、Linux系统、数据结构和ARM板实战相关文章,关注专栏:
手撕C语言
玩转linux
脚踢数据结构
系统、网络编程
探索C++
6818(ARM)开发板实战
📢写在最后
- 今天的分享就到这啦~
- 觉得博主写的还不错的烦劳
一键三连喔
~ - 🎉🎉🎉感谢关注🎉🎉🎉
相关文章:

【探索C++】string类详解
(꒪ꇴ꒪ ),Hello我是祐言QAQ我的博客主页:C/C语言,数据结构,Linux基础,ARM开发板,网络编程等领域UP🌍快上🚘,一起学习,让我们成为一个强大的攻城狮࿰…...

python 第一次作业
1.使用turtle换一个五环 2.设计这样一个程序:输入一个数字 判断它是不是一个质数 使用turtle换一个五环: >>> import turtle #导入模块 >>> turtle.width(10) #设置圆圈宽度 >>> turtle.color("blue&qu…...

个人博客网站一揽子:Docker建站(Nginx、Wordpress、MySql)
前言 既然安装了Docker,那就不妨建立一个自己的博客网站。实现内外网隔离网站部署,更安全。 1.创建Docker子网络 首先创建一个Docker虚拟子网: sudo docker network create wpnt检查是否建立成功: sudo docker network ls最后…...

Unity 课时 4 : No.4 模拟面试题
课时 4 : No.4 模拟面试题 C# 1. 请说明字符串中 string str null string str “” string str string.Empty 三者的区别 第一个未作初始化没有值, 第二个为空字符串, 答案: str null 在堆中没有分配内存地址 str "" 和 string.Empty 一样都是…...

Golang 基础面试题 01
Golang 面试题合集.png 背景 在之前的文章中分享了 k8s 相关的面试题,本文我们重点来讨论和 k8s 密切相关的 Go 语言面试题。 这几年随着云原生的兴起,大部分后端开发者,特别是 Java 开发者都或多或少的想学习一些 Go 相关的技能,…...

007-第一代软件需求整理
第一代软件需求整理 文章目录 第一代软件需求整理项目介绍需求来源需求来源1:竞品软件分析需求来源2:医生(市场)需求来源3:项目组内部需求来源4:软件组内部需求来源5:软件开发成员需求来源6&…...
XMLHttpRequest介绍
目录 一、介绍1.创建 XMLHttpRequest2.初始化3.发送请求4.获取响应5.响应类型 二、发送GET请求示例三、发送POST请求示例四、发送POST请求下载文件示例五、发送POST请求上传文件示例 一、介绍 1.创建 XMLHttpRequest let xhr new XMLHttpRequest();2.初始化 xhr.open(metho…...

阿里云无影云电脑和传统PC有什么区别?
阿里云无影云电脑和传统电脑PC有什么区别?区别大了,无影云电脑是云端的桌面服务,传统PC是本地的硬件计算机,无影云电脑的数据是保存在云端,本地传统PC的数据是保存在本地客户端,阿里云百科分享阿里云无影云…...

基于matlab实现的船舶横摇运动仿真程序
完整程序: clc clear syms w we; w0.4:0.05:1.6;mu90;v6;%kb1;kt1;%航速6m/s,航向90度,即横浪,cos(90)0 T3;B10;Sw0.785;%船宽10米,吃水3米,水线面系数假设为0.785 weww.^2.*v/9.8; for i1:24 delta_we(i)we(i1)-…...
Java手写二叉索引树和二叉索引树应用拓展案例
Java手写二叉索引树和二叉索引树应用拓展案例 1. 算法思维导图 以下为二叉索引树的实现原理的思维导图,使用Mermanid代码表示: #mermaid-svg-raMRIu7t3H33MKh1 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#…...

大数据知识点之大数据5V特征
大数据的特征可以浓缩为五个英文单词,Volume(大量)、Variety(多样性)、Velocity(速度)、Value(价值)、Veracity(准确性)。因为是5个特征都是以“V”开头的英文单词,又叫大数据5V特征。 概述&…...

Java的Socket通信的断网重连的正确写法
Java的Socket通信的断网重连的正确写法 Socket通信的断网重连介绍客户端与服务端源码演示截图本地演示服务器演示演示截图 总结 Socket通信的断网重连介绍 针对于已经建立通信的客户端与服务器,当客户端与服务器因为网络问题导致网络不通而断开连接了或者由于服务器…...

Rocketmq--消息发送和接收演示
使用Java代码来演示消息的发送和接收 <dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter</artifactId><version>2.0.2</version> </dependency> 1 发送消息 消息发送步骤: 创建…...

ArcGIS Pro将SHP文件转CAD并保留图层名称
相信大家应该都使用过ArcGIS将SHP文件转CAD格式,转换过后所有的要素都在一个图层内,那么有没有办法将SHP文件某个字段的值作为CAD的图层名字呢,答案是肯定的,这里就为大家介绍一下ArcGIS Pro转CAD文件并且保留图层名称的方法&…...
GEE:使用for循环合成时间序列影像
作者:CSDN @ _养乐多_ 在本博客中,我们将介绍如何使用Google Earth Engine创建一个时间序列图像集合,以便进行时间序列分析或生成动态图像。 文章目录 一、核心代码二、代码解释三、示例代码链接一、核心代码 // 创建一个空的 image 图像集合 var imagelist = ee.List([])…...
flink1.13.2版本的对应的hive的Hcatalog的使用记录
依赖版本要求<hive.version>3.1.2</hive.version><flink.version>1.13.2</flink.version><hadoop.version>3.3.2</hadoop.version><scala.binary.version...

STM32 ADC介绍和应用
目录 1.ADC是什么? 2.ADC的性能指标 3.ADC特性 4.ADC通道 5.ADC转换顺序 6.ADC触发方式 7.ADC转化时间 8.ADC转化模式 扫描模式 单次转换/连续转换 9.ADC实验 使用ADC读取烟雾传感器的值 代码实现思路: 1.ADC是什么? 全称&#…...

vue项目打包_以生产环境prod模式打包_vue-cli-service 不是内部或外部命令,也不是可运行的程序---vue工作笔记0025
打开命令行: 首先执行npm install 不执行会报错: npm run build:prod --scripts-prepend-node-pathauto 然后再这样执行就是以生产环境模式打包了....
FreeSWITCH的liberal dtmf
sip profile配置liberal-dtmf为true,或者通道变量rtp_liberal_dtmf为true,其含义就是不挑剔协商的DTMF,offer rfc2833并接受远端的rfc2833 和SIP INFO。 sofia.c的部分内容: // 收到sip info的处理 void sofia_handle_sip_i_inf…...

透明度模糊Android实现
最近有个需求,需要透明度加模糊,并且无法通过Glide的方式实现。研究后发现有一个第三方库可以实现这个效果 implementation com.github.Dimezis:BlurView:version-2.0.3在activity的onCreate()方法中 实现效果 可以看到上边的bar…...

第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...

剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...

苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...

零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...