【探索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…...
新手入门实战:基于 Spring Boot 的计算机毕设题目推荐管理系统设计与实现
对于计算机专业的同学来说,毕业设计(毕设)是大学学习成果的一次重要检验。然而,选题环节往往令人头疼:题目来源分散、重复率高、与个人兴趣或能力不匹配,缺乏一个集中的平台进行管理和推荐。今天࿰…...
经典游戏无法运行?DDrawCompat让老游戏在新系统重生
经典游戏无法运行?DDrawCompat让老游戏在新系统重生 【免费下载链接】DDrawCompat DirectDraw and Direct3D 1-7 compatibility, performance and visual enhancements for Windows Vista, 7, 8, 10 and 11 项目地址: https://gitcode.com/gh_mirrors/dd/DDrawCom…...
多维尺度变换(MDS)实战指南:从原理到Python实现
1. 多维尺度变换(MDS)是什么? 多维尺度变换(Multidimensional Scaling,简称MDS)是一种经典的降维算法,它的核心思想是通过保持数据点之间的距离关系,将高维数据映射到低维空间。想象…...
复杂网络演化博弈代码:从nw小世界网络到互动创新社区知识共享研究
复杂网络演化博弈代码 nw小世界网络 复现文章 基于网络演化博弈的互动创新社区用户 知识共享行为影响因素研究 An evolutionary analysis on the effect of government policies on electric vehicle diffusion in complex network ()最近在研究一些关于复杂网络演化博弈的有趣…...
Zrlog面试问答及问题解决方案
面试问答 结合 ZrLog 部署(Maven 构建 环境配置 服务部署)的全流程,整理排查 / 运维 / 开发三类高频问题,覆盖场景、原因、解答思路,可直接用于沟通或故障定位: 一、环境准备阶段高频问题 1. 执行 jav…...
照着用就行:全学科适配的降AIGC工具 千笔·专业降AI率智能体 VS PaperRed 一站式解决降重难题
随着AI技术的迅猛发展,学术写作中对AI生成内容的识别能力也在不断提升,许多学生和研究者发现,原本依赖AI辅助撰写的论文,如今在查重系统中频频被标记出高AIGC率,甚至影响最终成绩。这种现象不仅让许多人措手不及&#…...
Qwen3-ASR-1.7B在C++项目中的集成与应用
Qwen3-ASR-1.7B在C项目中的集成与应用 1. 环境准备与快速部署 要在C项目中集成Qwen3-ASR-1.7B语音识别功能,首先需要准备好开发环境。这个模型虽然功能强大,但部署起来并不复杂,只需要几个简单的步骤。 系统要求: 操作系统&am…...
快速部署:在星图AI平台训练PETRV2-BEV模型,支持NuScenes数据集
快速部署:在星图AI平台训练PETRV2-BEV模型,支持NuScenes数据集 1. 环境准备与快速部署 1.1 激活Paddle3D环境 首先需要确保已经创建并激活了Paddle3D的conda环境: conda activate paddle3d_env如果尚未创建该环境,建议先安装M…...
Node.js内存泄漏排查指南:从Chrome DevTools到heapdump的实战记录
Node.js内存泄漏排查实战:从预警信号到精准修复 当线上监控系统突然发出内存告警,你的Node.js服务正在以每小时100MB的速度吞噬服务器内存——这不是演习,而是一场真实的生产事故前兆。作为经历过数十次内存泄漏战役的老兵,我将带…...
Qwen3.5-4B-Claude-Opus入门必看:双RTX4090D GPU加速部署详解
Qwen3.5-4B-Claude-Opus入门必看:双RTX4090D GPU加速部署详解 1. 模型概述 Qwen3.5-4B-Claude-4.6-Opus-Reasoning-Distilled-GGUF是基于Qwen3.5-4B的推理蒸馏模型,专门针对结构化分析、分步骤回答以及代码与逻辑类问题进行了优化。该版本采用GGUF量化…...
