当前位置: 首页 > news >正文

【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' 是必须的,否则字符串操作函数(如 strlenstrcpy 等)无法正确判断字符串结束。
  • 字符串可修改:字符数组 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的字符

字符串的大小比较是按字典顺序进行,遵循以下规则:

  1. 如果两串长度和内容都相同,则==
  2. 如果第一个不相同字符的ASCII码较小,则对应的字符串较小。
  3. 如果一串是另一串的前缀,则前缀串较小。

常用成员函数

以下是一些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++语言程序设计】字符串与浅层复制(深拷贝与浅拷贝)

字符串常量是用一对双引号括起来的字符序列&#xff0c;例如&#xff0c;"abcd" " China"" This is a string." 都是字符串常量。它在内存中的存放形式是&#xff0c;按串中字符的排列次序顺序存放&#xff0c;每个字符占1字节&#xff0c;并在末…...

《TCP/IP网络编程》学习笔记 | Chapter 4:基于TCP的服务器端/客户端(1)

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

深入解析gdb -p 与gdb attach 的区别与使用场景

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

C语言 | Leetcode C语言题解之第542题01矩阵

题目&#xff1a; 题解&#xff1a; /*** 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

论文阅读笔记&#xff1a;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

文章目录 本课程有什么&#xff1f;前端是什么&#xff1f;1. **前端概述**2. **前端的工作职责**3. **前端技术栈**6. **前端开发工具**7. **HTML、CSS、JS的关系** 本课程有什么&#xff1f; 本套课程是零基础入门保姆级课程&#xff0c;课程主要内容包含&#xff1a; HTML…...

[WSL][桌面][X11]WSL2 Ubuntu22.04 安装Ubuntu桌面并且实现GUI转发(Gnome)

1. WSL安装 这里不再赘述&#xff0c;WSL2支持systemd&#xff0c;如果你发现其没有systemd相关指令&#xff0c;那么你应该看看下面这个 https://blog.csdn.net/noneNull0/article/details/135950369 但是&#xff0c;Ubuntu2204用不了这个脚本&#xff0c;比较蛋疼。 – …...

PMC如何根据实际情况调整生产作业计划?

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

unity中 骨骼、纹理和材质关系

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

18、论文阅读:AOD-Net:一体化除雾网络

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

Hadoop生态圈框架部署(五)- Zookeeper完全分布式部署

文章目录 前言一、Zookeeper完全分布式部署&#xff08;手动部署&#xff09;1. 下载Zookeeper2. 上传安装包2. 解压zookeeper安装包3. 配置zookeeper配置文件3.1 创建 zoo.cfg 配置文件3.2 修改 zoo.cfg 配置文件3.3 创建数据持久化目录并创建myid文件 4. 虚拟机hadoop2安装并…...

【机器学习】聚类算法分类与探讨

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…...

MySQL中distinct与group by之间的性能进行比较

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

计算机视觉读书系列(1)——基本知识与深度学习基础

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

怎么查看navicat的数据库密码

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

webrtc前端播放器完整案例

https://download.csdn.net/download/jinhuding/89961792...

GORM优化器和索引提示

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

linux驱动-i2c子系统框架学习(1)

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

元戎启行嵌入式面试题及参考答案

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

【EasyExcel】EasyExcel导出表格包含合计行、自定义样式、自适应列宽

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

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启&#xff0c;数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后&#xff0c;存在与用户组权限相关的问题。具体表现为&#xff0c;Oracle 实例的运行用户&#xff08;oracle&#xff09;和集…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码

目录 一、&#x1f468;‍&#x1f393;网站题目 二、✍️网站描述 三、&#x1f4da;网站介绍 四、&#x1f310;网站效果 五、&#x1fa93; 代码实现 &#x1f9f1;HTML 六、&#x1f947; 如何让学习不再盲目 七、&#x1f381;更多干货 一、&#x1f468;‍&#x1f…...

服务器--宝塔命令

一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行&#xff01; sudo su - 1. CentOS 系统&#xff1a; yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)

前言&#xff1a; 在Java编程中&#xff0c;类的生命周期是指类从被加载到内存中开始&#xff0c;到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期&#xff0c;让读者对此有深刻印象。 目录 ​…...

【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅

目录 前言 操作系统与驱动程序 是什么&#xff0c;为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中&#xff0c;我们在使用电子设备时&#xff0c;我们所输入执行的每一条指令最终大多都会作用到硬件上&#xff0c;比如下载一款软件最终会下载到硬盘上&am…...