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

C++字符串相关内容

字符串

字符串,本质上是一个接一个字符的一组字符。字母、数字、符号等。

const char*  字符串名

字符后面会有一个空终止符,为0。

字符串从指针的内存地址开始,然后继续下去,直到它碰到0,然后意识到字符串终止了。

#include <iostream>
int main()
{const char* name = "Miles";  //使用const之后,就不能再改变该字符串的内容。//name[2] = "a";char name2[5] = {'M','i','l','e','s'};std::cout << name << std::endl;std::cout << name2 << std::endl;std::cin.get();
}

为了使得代码更加简洁,通常会引入string。

string中有一个构造函数,它接收char*或const char*参数。

#include <iostream>
#include <string>
int main()
{std::string name1 = "Miles";std::cout << name1 << std::endl;std::cin.get();
}

std::string 是一个有很多功能的类。

name.size()可以找到其尺寸;strlen(),字符串的长度;strcpy,复制字符串;

字符串相加,可以考虑重载运算符:“+=”。

#include <iostream>
#include <string>
int main()
{std::string name1 = "Miles";name1 += " hello!";std::cout << name1 << std::endl;std::cin.get();
}
//输出:
//Miles hello!

字符串相加,或者可以用另一种方法进行:将两个相加的字符数组的其中一个,显式调用一个string构造函数。相当于创建了一个字符串,然后附加这个字符串给另一个。

#include <iostream>
#include <string>
int main()
{std::string name1 = std::string("Miles")+ " hello!";std::cout << name1 << std::endl;std::cin.get();
}
//输出:
//Miles hello!

如果要寻找字符串中的文本,可以使用name.find()。

#include <iostream>
#include <string>
int main()
{std::string name1 = std::string("Miles")+ " hello!";bool contains = name1.find("es") != std::string::npos;  std::cout << name1 << std::endl;std::cin.get();
}

其中,std::string::npos代表一个不存在的位置。将结果给contains。

#include <iostream>
#include <string>
void PrintString(std::string string)
{string += "h";std::cout << string << std::endl;
}
int main()
{std::string name1 = std::string("Miles")+ " hello!";PrintString(name1);bool contains = name1.find("es") != std::string::npos;  std::cout << name1 << std::endl;std::cin.get();
}
//输出:
//Miles hello!h
//Miles hello!

需要分配一个全新的char数组,来存储我们已经得到的完全相同的文本。

字符串复制,实际上相当慢。

当我们需要传递一个字符串,而且在只读的情况下,需要确保通过常量引用传递它。此时通常在前面加上const和引用&。

void PrintString(const std::string& string)
{//string += "h";std::cout << string << std::endl;
}

字符串字面量

字符串字面量,是在双引号之间的一串字符。

字符串后面有一个额外的字符,叫做:空终止字符。

#include <iostream>
#include <string>#include <stdlib.h>
int main()
{const char name[7] = "Mi\0les";std::cout << strlen(name) << std::endl; //打印出字符串的长度。std::cin.get();
}

字符串的相加,还能用到string_literals库。在字符串后面加上s,即可实现字符串的相加。

#include <iostream>
#include <string>
#include <stdlib.h>
int main()
{using namespace std::string_literals;std::string name = "Miles"s + " hello!";std::cout << name << std::endl; std::cin.get();
}
//输出:
//Miles hello!

其中,s实际上是一个函数。操作符函数,它返回标准字符串(对象)。

R可以用来忽略转义字符。使得代码更加简洁。

#include <iostream>
#include <string>#include <stdlib.h>
int main()
{const char* example = R"(Line1
line2
line3)"  ;//R忽略转义字符const char* ex = "Line1\n""line2\n""line3\n";std::cout << example << std::endl;std::cout << ex << std::endl;std::cin.get();
}

字符串字面量永远保存在内存的只读区域,

关键字const

关键字

const,称为伪关键字。因为它在改变生成代码方面做不了什么。有点像类和结构体的可见性。

#include<iostream>
#include<string>
int main()
{const int MAX_AGE = 90;std::cin.get();
}

在堆上建立一个整数,就能得到一个指针。此时有两个方案:

  • 逆向引用dereference
  • 重新分配实际的指针,这样会指向别的东西

用const强制定义一个变量为只读常量。但可以强制改变这个定义,如下,利用(int*)可以将const只读常量的值,逆向引用传给另一个变量。

#include<iostream>
#include<string>
int main()
{const int MAX_AGE = 90;int* a = new int;*a = 2;a = (int*)&MAX_AGE;std::cout << *a << std::endl;std::cin.get();
}
//输出:
//90

但,const int* 意味着,不能修改指针指向的内容。该用法和int const*一致。

const int* a = new int;
int const* a = new int;

int* const可以改变指针指向的内容,但不能把实际的指针本身重新赋值,指向别的东西

#include<iostream>
#include<string>
class Entity
{
private:int m_X, m_Y;
public:int GetX() const //此用法,只能读,不能写。该方法只能进行读操作,不能进行其他的修改操作。{return m_X;}void SetX(int x){m_X = x;}
};
int main()
{const int MAX_AGE = 90;int* a = new int;*a = 2;a = (int*)&MAX_AGE;std::cout << *a << std::endl;std::cin.get();
}

如果用再次复制Entity类的方式,需要分配空间,那样会很慢。可以通过常量引用传递的方式。也就是:const Entity& e

#include<iostream>
#include<string>
class Entity
{
private:int m_X, m_Y;
public:int GetX() const{return m_X;}void SetX(int x){m_X = x;}
};
void PrintEntity(const Entity& e)
{std::cout << e.GetX() << std::endl; //由于GetX()用到了const,才能在这里用到e.GetX()
}
int main()
{const int MAX_AGE = 90;int* a = new int;*a = 2;a = (int*)&MAX_AGE;std::cout << *a << std::endl;std::cin.get();
}

如果要对int GetX() const中的变量进行修改的话,可以引入mutable:

#include<iostream>
#include<string>
class Entity
{
private:int m_X, m_Y;mutable int var;
public:int GetX() const{var = 2;return m_X;}void SetX(int x){m_X = x;}
};

mutable允许函数是常量的方法,可以修改变量。

关键字mutable

mutable的两种不同用途:

  • 与const一同使用。
  • 用在lambda表达式中。

或者mutable可以同时覆盖两种情况。

#include <iostream>
#include <string>
class Entity
{
private:std::string m_Name;mutable int m_DebugCount;
public:const std::string& GetName() const{m_DebugCount++;  //每次调用get的时候,都会记一次数return m_Name;}
};
int main()
{const Entity e;e.GetName();std::cin.get();
}

在类成员中使用mutable。

lambda基本上像一个一次性的小函数,可以写出来并赋值给一个变量。

#include <iostream>
#include <string>class Entity
{
private:std::string m_Name;mutable int m_DebugCount;
public:const std::string& GetName() const{m_DebugCount++;  return m_Name;}
};
int main()
{const Entity e;e.GetName();
//lambda的使用如下:int x = 8;auto f = [&](){x++;std::cout << x << std::endl;};f();std::cin.get();
}

lambda还有其他的用法,三种auto用法一致。

int x = 8;
auto f = [&]()
{x++;std::cout << x << std::endl;
};
auto f = [=]() mutable
{x++;std::cout << x << std::endl;
};
auto f = [=]()
{int y = x;y++;std::cout << x << std::endl;
};
f();

相关文章:

C++字符串相关内容

字符串 字符串&#xff0c;本质上是一个接一个字符的一组字符。字母、数字、符号等。 const char* 字符串名 字符后面会有一个空终止符&#xff0c;为0。 字符串从指针的内存地址开始&#xff0c;然后继续下去&#xff0c;直到它碰到0&#xff0c;然后意识到字符串终止了。 …...

利用二分法进行 SQL 时间盲注

什么是时间盲注&#xff1f; SQL 盲注&#xff08;Blind SQL Injection&#xff09;是一种常见的 Web 安全漏洞&#xff0c;其中时间盲注是基于查询延迟的 SQL 注入方式。当服务器不返回可见的错误信息时&#xff0c;我们可以利用 SLEEP() 函数来判断查询结果是否符合预期。 …...

数据库管理-第293期 奇怪的sys.user$授权+(20250210)

数据库管理293期 2025-02-10 数据库管理-第293期 奇怪的sys.user$授权&#xff08;20250210&#xff09;1 清空shared pool2 SR反馈总结 数据库管理-第293期 奇怪的sys.user$授权&#xff08;20250210&#xff09; 作者&#xff1a;胖头鱼的鱼缸&#xff08;尹海文&#xff09…...

react实例与总结(一)

目录 一、简单认识 1.1、特点 1.2、JSX语法规则 1.3、函数组件和类式组件 1.4、类组件三大属性state、props、refs 1.4.1、state 1.4.2、props 1.4.3、refs 1.5、事件处理 1.6、收集表单数据—非受控组件和受控组件 1.7、高阶函数—函数柯里化 1.8、生命周期—新旧…...

电路研究9.3——合宙Air780EP中的AT开发指南(含TCP 示例)

根据合宙的AT研发推荐&#xff0c; AT指令基本上也简单看完了&#xff0c;这里开始转到AT的开发了。 AT 命令采用标准串口进行数据收发&#xff0c;将以前复杂的设备通讯方式转换成简单的串口编程&#xff0c; 大大简化了产品的硬件设计和软件开发成本&#xff0c;这使得几乎所…...

Qt 数据库SQLite 使用【01】基本功能

1.开发背景 Qt 开发过程中难免需要存储数据&#xff0c;可以选择保存到本地文件&#xff0c;但是查找比较麻烦&#xff0c;所以就有了数据库&#xff0c;主要是方便查找数据&#xff0c;增删改查等操作&#xff0c;而 SqLite 属于数据库中轻量级的存在&#xff0c;适合本地数据…...

stm32小白成长为高手的学习步骤和方法

我们假定大家已经对STM32的书籍或者文档有一定的理解。如不理解&#xff0c;请立即阅读STM32的文档&#xff0c;以获取最基本的知识点。STM32单片机自学教程 这篇博文也是一篇不错的入门教程&#xff0c;初学者可以看看&#xff0c;讲的真心不错。 英文好的同学&#xf…...

大模型产品Deepseek(五)、本地安装部署(Docker方式)

DeepSeek 本地部署指南 DeepSeek是一款高效的智能搜索与推荐引擎,除了通过云端API提供服务外,它还支持本地部署,让开发者可以完全控制数据和计算资源。通过本地部署,您可以将DeepSeek集成到内部系统中,在私有环境下运行模型,减少对外部API的依赖,同时提升数据隐私性与响…...

Kafka 的消费offset原来是使用ZK管理,现在新版本是怎么管理的?

目录 基于 ZooKeeper 管理消费 offset 原理 缺点 新版本基于内部主题管理消费 offset 原理 优点 示例代码(Java) 在 Kafka 早期版本中,消费者的消费偏移量(offset)是存储在 ZooKeeper 中的,但由于 ZooKeeper 并不适合高频读写操作,从 Kafka 0.9 版本开始,消费偏…...

基于改进型灰狼优化算法(GWO)的无人机路径规划

内容&#xff1a; 基于改进型灰狼优化算法的无人机轨迹规划 GWO是一种群体智能优化算法&#xff0c;模仿灰狼的社会等级和狩猎行为。原始的GWO有一些局限性&#xff0c;比如容易陷入局部最优&#xff0c;收敛速度慢等&#xff0c;所以改进型的GWO可能通过不同的策略来优化这些…...

JS中|=是什么意思?

在JavaScript中&#xff0c;| 是一个位运算符的复合赋值操作&#xff0c;具体表示按位或赋值运算。这个操作符会对两个操作数进行按位或&#xff08;|&#xff09;运算&#xff0c;然后将结果赋值回左操作数。 let a 5; // 二进制表示为 0101let b 3; // 二进制表示为 0011a …...

快速上手Vim的使用

Vim Linux编辑器-vim使用命令行模式下所有选项都可以带数字底行模式可视块模式&#xff08;ctrlV进入&#xff09; Linux编辑器-vim使用 Vim有多种模式的编辑器。能帮助我们很快的进行代码的编辑&#xff0c;甚至完成很多其他事情。 默认情况下我们打开vim在命令模式下&#x…...

RPA与深度学习结合

什么是RPA RPA即机器人流程自动化&#xff08;Robotic Process Automation&#xff09;&#xff0c;它是一种利用软件机器人模拟人类在计算机上的操作&#xff0c;按照预设的规则自动执行一系列重复性、规律性任务的技术。这些任务可以包括数据录入、文件处理、报表生成、系统…...

在阿里云ECS上一键部署DeepSeek-R1

DeepSeek-R1 是一款开源模型&#xff0c;也提供了 API(接口)调用方式。据 DeepSeek介绍&#xff0c;DeepSeek-R1 后训练阶段大规模使用了强化学习技术&#xff0c;在只有极少标注数据的情况下提升了模型推理能力&#xff0c;该模型性能对标 OpenAl o1 正式版。DeepSeek-R1 推出…...

长安汽车发布“北斗天枢2.0”计划,深蓝汽车普及全民智驾

2月9日&#xff0c;长安汽车智能化战略“北斗天枢2.0”计划暨深蓝汽车全场景智能驾驶解决方案发布会在重庆盛大召开。此次发布会标志着长安汽车正式迈入智能化战略的新纪元&#xff0c;携手众多“中国智驾合伙人”&#xff0c;共同开启全民智驾元年。 发布会上&#xff0c;长安…...

Aitken 逐次线性插值

Aitken 逐次线性插值 用 Lagrange 插值多项式 L n ( x ) L_n(x) Ln​(x)计算函数近似值时&#xff0c;如需增加插值节点&#xff0c;那么原来算出的数据均不能利用&#xff0c;必须重新计算。为克服这个缺点&#xff0c;可用逐次线性插值方法求得高次插值。 令 I i 1 , i 2…...

docker 安装 Prometheus、Node Exporter 和 Grafana

Docker Compose 配置文件 docker-compose.yml services:prometheus:image: prom/prometheus:latestcontainer_name: prometheusvolumes:- ./prometheus.yml:/etc/prometheus/prometheus.yml # 挂载配置文件 - prometheus_data:/prometheus # 持久化数据存储 command:- --…...

【LeetCode 热题100】74:搜索二维矩阵(二分、线性两种方式 详细解析)(Go 语言实现)

&#x1f680; 力扣热题 74&#xff1a;搜索二维矩阵&#xff08;详细解析&#xff09; &#x1f4cc; 题目描述 力扣 74. 搜索二维矩阵 给你一个满足下述两条属性的 m x n 整数矩阵 matrix &#xff1a; 每行中的整数从左到右按非递减顺序排列。每行的第一个整数大于前一行的…...

元数据、数据元、数据元素、数据项 和 主数据的概念

一、元数据 1.概念 元数据&#xff0c;又称中介数据、中继数据&#xff0c;为描述数据的数据。主要是描述数据属性的信息&#xff0c;用来支持如指示存储位置、历史数据、资源查找、文件记录等功能。 2.实例 数据库中&#xff0c;表的名称、表字段名、其他相关的描述信息&a…...

阿里云cdn怎样设置图片压缩

阿里云 CDN 提供了图像加速服务&#xff0c;其中包括图像压缩功能。通过设置图片压缩&#xff0c;可以显著减小图片文件的体积&#xff0c;提升网站加载速度&#xff0c;同时减少带宽消耗。九河云来告诉你如何进行图片压缩吧。 如何设置阿里云 CDN 图片压缩&#xff1f; 1. 登…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

技术栈RabbitMq的介绍和使用

目录 1. 什么是消息队列&#xff1f;2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...

R语言速释制剂QBD解决方案之三

本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...

LRU 缓存机制详解与实现(Java版) + 力扣解决

&#x1f4cc; LRU 缓存机制详解与实现&#xff08;Java版&#xff09; 一、&#x1f4d6; 问题背景 在日常开发中&#xff0c;我们经常会使用 缓存&#xff08;Cache&#xff09; 来提升性能。但由于内存有限&#xff0c;缓存不可能无限增长&#xff0c;于是需要策略决定&am…...

MFE(微前端) Module Federation:Webpack.config.js文件中每个属性的含义解释

以Module Federation 插件详为例&#xff0c;Webpack.config.js它可能的配置和含义如下&#xff1a; 前言 Module Federation 的Webpack.config.js核心配置包括&#xff1a; name filename&#xff08;定义应用标识&#xff09; remotes&#xff08;引用远程模块&#xff0…...

webpack面试题

面试题&#xff1a;webpack介绍和简单使用 一、webpack&#xff08;模块化打包工具&#xff09;1. webpack是把项目当作一个整体&#xff0c;通过给定的一个主文件&#xff0c;webpack将从这个主文件开始找到你项目当中的所有依赖文件&#xff0c;使用loaders来处理它们&#x…...

深入浅出WebGL:在浏览器中解锁3D世界的魔法钥匙

WebGL&#xff1a;在浏览器中解锁3D世界的魔法钥匙 引言&#xff1a;网页的边界正在消失 在数字化浪潮的推动下&#xff0c;网页早已不再是静态信息的展示窗口。如今&#xff0c;我们可以在浏览器中体验逼真的3D游戏、交互式数据可视化、虚拟实验室&#xff0c;甚至沉浸式的V…...

Django RBAC项目后端实战 - 03 DRF权限控制实现

项目背景 在上一篇文章中&#xff0c;我们完成了JWT认证系统的集成。本篇文章将实现基于Redis的RBAC权限控制系统&#xff0c;为系统提供细粒度的权限控制。 开发目标 实现基于Redis的权限缓存机制开发DRF权限控制类实现权限管理API配置权限白名单 前置配置 在开始开发权限…...

【大厂机试题解法笔记】矩阵匹配

题目 从一个 N * M&#xff08;N ≤ M&#xff09;的矩阵中选出 N 个数&#xff0c;任意两个数字不能在同一行或同一列&#xff0c;求选出来的 N 个数中第 K 大的数字的最小值是多少。 输入描述 输入矩阵要求&#xff1a;1 ≤ K ≤ N ≤ M ≤ 150 输入格式 N M K N*M矩阵 输…...