【c++语言程序设计】字符串与浅层复制(深拷贝与浅拷贝)
字符串常量是用一对双引号括起来的字符序列,例如,"abcd" " China"" This is a string." 都是字符串常量。它在内存中的存放形式是,按串中字符的排列次序顺序存放,每个字符占1字节,并在末尾添加'\0'作为结尾标记
字符串常量指针
这实际上是一个隐含创建的类型为 char的数组,一个字符串常量就表示这样一个数组的首地址。
const char *STRING1 = "This is a string.";
它是一个常量字符串,无法通过 STRING1
修改字符串内容
字符数组
字符串变量也可以用类似方式来表示。如果创建一个 char数组,每个元素存放字符串的一个字符,在末尾放置一个'\0',便构成了C++字符串。
在定义用于存放字符串的字符数组时,数组长度应至少为字符串字符数加1(用于存储结尾的 '\0'
)
char str[8] = {'p', 'r', 'o', 'g', 'r', 'a', 'm', '\0'};
char str[8] = "program";
char str[] = "program";
它的存储方式与字符串常量无异,但由于它是程序员创建的数组,因此可以改写其内容,因而这就是字符串变量而非常量
- 数组大小:定义字符数组的长度时,大小应至少为字符串长度加1。
'\0'
结尾:字符串结尾'\0'
是必须的,否则字符串操作函数(如strlen
、strcpy
等)无法正确判断字符串结束。- 字符串可修改:字符数组
str
是变量,可以直接修改其内容,而字符串常量不允许这样操作。
尽管对用字符数组表示的字符串进行初始化还比较容易、直观,但进行许多其他字符串操作时却比较麻烦。执行很多字符串操作需要借助 cstring头文件中的字符串处理函数,例如将一个字符串的内容复制到另一个字符串需要用 strepy函数,按辞典顺序比较两个的大小需要用 strcmp函数,将两个字符串连接起来需要用 strcat函数。另外,当字符串长度很不确定时,需要用 new 动态创建字符数组,最后还要用 delete释放,这些都相当烦琐。
string 类
数组数据与处理数据的函数分离也不符合面向对象方法的要求。
C++标准类库将面向对象的串的概念加入到C++语言中,预定义了字符串类( string类),string类提供了对字符串进行处理所需要的操作。使用 string类需要包含头文件 string。string类封装了串的属性并提供了一系列允许访问这些属性的函数。
string
类的构造函数
-
string()
:默认构造函数,创建一个长度为0的字符串。 -
string(const string& rhs)
:复制构造函数,用已有的string
对象初始化新的string
对象。 -
string(const char* s)
:使用指向字符串常量的指针*s
初始化string
对象。 -
string(const string& rhs, unsigned int pos, unsigned int n)
:从rhs
对象的pos
位置开始提取n
个字符,用它们初始化新的string
对象。 -
string(const char* s, unsigned int n)
:使用指针s
所指字符串的前n
个字符初始化string
对象。 -
string(unsigned int n, char c)
:将字符c
重复n
次,用于初始化string
对象
由于
string
类接收const char*
类型的构造函数,字符串常量和字符数组都可以隐式转换为string
对象。string str = "Hello world!";
string
类的操作符
string
类重载了许多操作符,支持赋值、连接、比较等功能
操作符 | 示例 | 功能说明 |
+ | s + t | 将字符串s和t连接成新串 |
= | s = t | 用t更新s |
+= | s += t | 等价于s = s + t |
== | s == t | 判断s和t是否相等 |
!= | s != t | 判断s和t是否不等 |
< | s < t | 判断s是否小于t(字典顺序) |
<= | s <= t | 判断s是否小于或等于t |
> | s > t | 判断s是否大于t |
>= | s >= t | 判断s是否大于或等于t |
[ ] | s[i] | 访问字符串s中下标i的字符 |
字符串的大小比较是按字典顺序进行,遵循以下规则:
- 如果两串长度和内容都相同,则
==
。- 如果第一个不相同字符的ASCII码较小,则对应的字符串较小。
- 如果一串是另一串的前缀,则前缀串较小。
常用成员函数
以下是一些string
类的常用成员函数:
-
追加:
string append(const char* s)
:将字符串s
追加到本串尾部。 -
赋值:
string assign(const char* s)
:将s
赋值给本对象。 -
比较:
int compare(const string& str) const
:比较本字符串和str
的大小。 -
插入:
string& insert(unsigned int p0, const char* s)
:将s
插入到本串的p0
位置前。 -
取子串:
string substr(unsigned int pos, unsigned int n) const
:返回从pos
位置开始的n
个字符的子串。 -
查找:
unsigned int find(const basic_string& str) const
:查找并返回str
第一次在本串中出现的位置。 -
获取长度:
unsigned int length() const
:返回字符串的长度(字符个数)。 -
交换:
void swap(string& str)
:交换本字符串和str
的内容。
#include <string>
#include <iostream>
using namespace std;// 根据 value 的值输出 true 或 false,title 为提示文字
inline void test(const char *title, bool value) {cout << title << " returns " << (value ? "true" : "false") << endl;
}int main() {string s1 = "DEF";cout << "s1 is " << s1 << endl;string s2;cout << "Please enter s2: ";cin >> s2; // 输入字符串 s2cout << "length of s2: " << s2.length() << endl; // 输出 s2 的长度// 比较运算符的测试test("s1 <= \"ABC\"", s1 <= "ABC"); // 判断 s1 是否小于等于 "ABC"test("\"DEF\" <= s1", "DEF" <= s1); // 判断 "DEF" 是否小于等于 s1// 连接运算符的测试s2 += s1; // 将 s1 连接到 s2 的末尾cout << "s2 = s2 + s1: " << s2 << endl;cout << "length of s2: " << s2.length() << endl; // 输出连接后的 s2 的长度return 0;
}
getline
函数
getline
函数是用于从输入流中读取字符串的函数,在C++中,常用于从cin
或文件中获取一行字符串。
-
getline
不会忽略开头的空白字符(空格、制表符等),直接将其作为内容的一部分。 -
getline
读取结束后,分隔符本身不会包含在字符串中,但会从输入流中移除
#include <iostream>
#include <string>
using namespace std;int main() {for (int i = 0; i < 2; i++) {string city, state;// 以逗号为分隔符读取城市名称getline(cin, city, ',');// 读取国家/地区名称,直到行尾getline(cin, state);cout << "City: " << city << " State: " << state << endl;}return 0;
}
使用场景
读取整行文本:适用于读取包含空格的完整句子,如从用户输入中获取一行完整文本。
自定义分隔:适合处理结构化文本输入,指定分隔符来分割输入内容,例如CSV文件的逐行读取
相关文章:

【c++语言程序设计】字符串与浅层复制(深拷贝与浅拷贝)
字符串常量是用一对双引号括起来的字符序列,例如,"abcd" " China"" This is a string." 都是字符串常量。它在内存中的存放形式是,按串中字符的排列次序顺序存放,每个字符占1字节,并在末…...

《TCP/IP网络编程》学习笔记 | Chapter 4:基于TCP的服务器端/客户端(1)
《TCP/IP网络编程》学习笔记 | Chapter 4:基于TCP的服务器端/客户端(1) 《TCP/IP网络编程》学习笔记 | Chapter 4:基于TCP的服务器端/客户端(1)理解TCP和UDPTCP/IP协议栈TCP/IP协议的诞生背景链路层网络层T…...

深入解析gdb -p 与gdb attach 的区别与使用场景
摘要:本文将详细对比gdb -p 与gdb attach 这两个命令的使用方法、场景及优缺点,帮助读者更好地理解并运用这两个调试工具。 一、引言 在Linux系统中,GDB(GNU Debugger)是一款功能强大的调试工具,广泛应用…...

C语言 | Leetcode C语言题解之第542题01矩阵
题目: 题解: /*** Return an array of arrays of size *returnSize.* The sizes of the arrays are returned as *returnColumnSizes array.* Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().*/ type…...

论文阅读笔记:Image Processing GNN: Breaking Rigidity in Super-Resolution
论文阅读笔记:Image Processing GNN: Breaking Rigidity in Super-Resolution 1 背景2 创新点3 方法4 模块4.1 以往SR模型的刚性4.2 图构建4.2.1 度灵活性4.2.2 像素节点灵活性4.2.3 空间灵活性 4.3 图聚合4.4 多尺度图聚合模块MGB4.5 图聚合层GAL 5 效果5.1 和SOTA…...

前端介绍|基础入门-html+css+js
文章目录 本课程有什么?前端是什么?1. **前端概述**2. **前端的工作职责**3. **前端技术栈**6. **前端开发工具**7. **HTML、CSS、JS的关系** 本课程有什么? 本套课程是零基础入门保姆级课程,课程主要内容包含: HTML…...

[WSL][桌面][X11]WSL2 Ubuntu22.04 安装Ubuntu桌面并且实现GUI转发(Gnome)
1. WSL安装 这里不再赘述,WSL2支持systemd,如果你发现其没有systemd相关指令,那么你应该看看下面这个 https://blog.csdn.net/noneNull0/article/details/135950369 但是,Ubuntu2204用不了这个脚本,比较蛋疼。 – …...

PMC如何根据实际情况调整生产作业计划?
面对原材料价格波动、市场需求突变、供应链不确定性增加等多重挑战,PMC人员如何根据实际情况迅速调整生产作业计划,成为了决定企业能否稳健前行的关键。今天,天行健企业管理咨询公司就来深入探讨,PMC高手们是如何在复杂多变的环境…...

unity中 骨骼、纹理和材质关系
在Unity和游戏开发中,骨骼(Skeleton)、纹理(Texture)和材质(Material)是角色和物体渲染的关键组成部分,它们各自的作用和关系密切关联,通常共同工作来实现一个模型的最终…...

18、论文阅读:AOD-Net:一体化除雾网络
AOD-Net: All-in-One Dehazing Network 前言介绍相关工作物理模型传统方法深度学习方法 建模与扩展变换后的公式网络设计与高级特征任务相结合 除雾评价数据集和实现 前言 该论文提出了一种基于卷积神经网络(CNN)的图像去雾模型,称为 All-in…...

Hadoop生态圈框架部署(五)- Zookeeper完全分布式部署
文章目录 前言一、Zookeeper完全分布式部署(手动部署)1. 下载Zookeeper2. 上传安装包2. 解压zookeeper安装包3. 配置zookeeper配置文件3.1 创建 zoo.cfg 配置文件3.2 修改 zoo.cfg 配置文件3.3 创建数据持久化目录并创建myid文件 4. 虚拟机hadoop2安装并…...

【机器学习】聚类算法分类与探讨
💗💗💗欢迎来到我的博客,你将找到有关如何使用技术解决问题的文章,也会找到某个技术的学习路线。无论你是何种职业,我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章,也欢…...

MySQL中distinct与group by之间的性能进行比较
在 MySQL 中,DISTINCT 和 GROUP BY 都是用于去重或汇总数据的常用 SQL 语法。尽管它们在某些情况下能产生相同的结果,但它们的内部工作方式和性能表现可能有所不同。理解这两者的差异,对于选择正确的语法非常重要,尤其是在处理大量…...

计算机视觉读书系列(1)——基本知识与深度学习基础
研三即将毕业,后续的工作可能会偏AI方向的计算机视觉方面,因此准备了两条线来巩固计算机视觉基础。 一个是本系列,阅读经典《Deep Learning for Vision System》,做一些总结跑一些例子,也对应本系列文章 二是OpenCV实…...

怎么查看navicat的数据库密码
步骤1:打开navicat连接数据库工具,顶部的文件栏-导出结果-勾选导出密码-导出 步骤2:导出结果使用NotePad或文本打开,找到,数据库对应的的Password"995E66F64A15F6776“”的值复制下来 <Connection ConnectionName"…...

webrtc前端播放器完整案例
https://download.csdn.net/download/jinhuding/89961792...

GORM优化器和索引提示
在使用 GORM 进行数据库操作时,优化器和索引提示可以帮助你提高查询性能。GORM 提供了一些方法来利用这些特性。 优化器提示 优化器提示(Optimizer Hints)是数据库系统提供的功能,用于指导查询优化器如何处理查询。不同的数据库…...

linux驱动-i2c子系统框架学习(1)
可以将整个 I2C 子系统用下面的框图来描述: 可以将上面这一 I2C 子系统划分为三个层次,分别为用户空间、内核空间和硬件层,内核空间就包括 I2C 设备驱动层、I2C 核心层和 I2C 适配器驱动层, 本篇主要内容就是介绍 I2C 子系统框架中…...

元戎启行嵌入式面试题及参考答案
介绍下 CAN 通信原理 控制器局域网(CAN)是一种串行通信协议,主要用于汽车、工业自动化等领域的电子控制单元(ECU)之间的通信。 其通信原理是基于多主站架构。在总线上,多个节点(设备)都可以主动发起通信。CAN 协议使用差分信号来传输数据,通过两条信号线 CAN_H 和 CAN…...

【EasyExcel】EasyExcel导出表格包含合计行、自定义样式、自适应列宽
目录 0 EasyExcel简介1 Excel导出工具类设置自定义表头样式设置自适应列宽添加合计行 2 调用导出工具类导出Excel表3 测试结果 0 EasyExcel简介 在数据处理和报表生成的过程中,Excel是一个非常常用的工具。特别是在Java开发中,EasyExcel库因其简单高效而…...

es数据同步(仅供自己参考)
数据同步的问题分析: 当MySQL进行增删改查的时候,数据库的数据有所改变,这个时候需要修改es中的索引库的值,这个时候就涉及到了数据同步的问题 解决方法: 1、同步方法: 当服务对MySQL进行增删改的时候&…...

apt镜像源制作-ubuntu22.04
# 安装必要的软件 sudo apt-get install -y apt-mirror # 编辑/etc/apt/mirror.list,添加以下内容 set base_path /var/spool/apt-mirror # 指定要镜像的Ubuntu发布和组件-null dir jammy-updates main restricted universe multiverse # 镜像的Ubuntu发布和组件的URL-n…...

libaom 源码分析: 预测编码过程梳理
AV1 预测编码中核心技术 AV1(AOMedia Video 1)作为一种开源的视频编码格式,其预测编码核心技术主要包括以下几个方面: 分区树分割模块: AV1利用多类型分割模式,递归地对图像/视频序列进行分区,以捕捉更丰富的空间信息,从而提升编码效率。这包括新的方向预测分割模式及…...

从0开始学习Linux——Yum工具
往期目录: 从0开始学习Linux——简介&安装 从0开始学习Linux——搭建属于自己的Linux虚拟机 从0开始学习Linux——文本编辑器 上一个章节我们简单了解了Linux中常用的一些文本编辑器,本次教程我们将学习yum工具。 一、Yum简介 Yum(全名…...

【Linux】Linux管道揭秘:匿名管道如何连接进程世界
🌈个人主页:Yui_ 🌈Linux专栏:Linux 🌈C语言笔记专栏:C语言笔记 🌈数据结构专栏:数据结构 🌈C专栏:C 文章目录 1.什么是管道 ?2. 管道的类型2.1 匿…...

【LeetCode】【算法】155. 最小栈
LeetCode 155. 最小栈 题目描述 设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化堆栈对象。 void push(int val) 将元素val推入堆栈。 void pop() 删除堆栈顶部的元素。 int …...

3.3 windows,ReactOS系统中页面的换出----1
系列文章目录 文章目录 系列文章目录3.3 页面的换出MiBalancerThread()MmTrimUserMemory()MmPageOutVirtualMemory() 3.3 页面的换出 在前一节中我们看到,如果有映射的页面已经被倒换到磁盘上即倒换文件中,…...

QCustomPlot添加自定义的图例,实现隐藏、删除功能(二)
文章目录 实现步骤:详细代码示例:实现原理和解释:使用方法:其他参考要实现一个支持复选框来控制曲线显示和隐藏的自定义 QCPLegend 类,可以通过继承 QCPLegend 并重写绘制和事件处理方法来实现,同时发出信号通知曲线的状态变更。 实现步骤: 继承 QCPLegend 类,添加绘…...

Linux云计算 |【第五阶段】CLOUD-DAY8
主要内容: 掌握DaemonSet控制器、污点策略(NoSchedule、Noexecute)、Job / CronJob资源对象、掌握Service服务、服务名解析CluterIP(服务名自动发现)、(Nodeport、Headless)、Ingress控制器 一…...

岛屿数量 广搜版BFS C#
和之前的卡码网深搜版是一道题 力扣第200题 99. 岛屿数量 题目描述 给定一个由 1(陆地)和 0(水)组成的矩阵,你需要计算岛屿的数量。岛屿由水平方向或垂直方向上相邻的陆地连接而成,并且四周都是水域。…...