当前位置: 首页 > 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库因其简单高效而…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了&#xff1a;一行…...

centos 7 部署awstats 网站访问检测

一、基础环境准备&#xff08;两种安装方式都要做&#xff09; bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats&#xff0…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话&#xff1a; “利润不是赚出来的&#xff0c;是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业&#xff0c;很多企业看着销售不错&#xff0c;账上却没钱、利润也不见了&#xff0c;一翻库存才发现&#xff1a; 一堆卖不动的旧货…...

反射获取方法和属性

Java反射获取方法 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时访问和操作类的内部属性和方法。通过反射&#xff0c;可以动态地创建对象、调用方法、改变属性值&#xff0c;这在很多Java框架中如Spring和Hiberna…...

python执行测试用例,allure报乱码且未成功生成报告

allure执行测试用例时显示乱码&#xff1a;‘allure’ &#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;ڲ&#xfffd;&#xfffd;&#xfffd;&#xfffd;ⲿ&#xfffd;&#xfffd;&#xfffd;Ҳ&#xfffd;&#xfffd;&#xfffd;ǿ&#xfffd;&am…...

代码随想录刷题day30

1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额&#xff0c;返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...

无人机侦测与反制技术的进展与应用

国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机&#xff08;无人驾驶飞行器&#xff0c;UAV&#xff09;技术的快速发展&#xff0c;其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统&#xff0c;无人机的“黑飞”&…...

MFC 抛体运动模拟:常见问题解决与界面美化

在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用

一、方案背景​ 在现代生产与生活场景中&#xff0c;如工厂高危作业区、医院手术室、公共场景等&#xff0c;人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式&#xff0c;存在效率低、覆盖面不足、判断主观性强等问题&#xff0c;难以满足对人员打手机行为精…...