P24 C++ 字符串常量

前言

本期我们讨论字符串字面量。

这是一种基于字符串的东西,上一章我们讲过字符串,你一定要去先去看看那一期的内容。

P23 C++字符串-CSDN博客

01 什么是字符串字常量呢?

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

在上面的代码中,我们通过双引号定义了一个字符串字常量。

当指针悬停在“hello world0” 时,会弹出下面语句

(const char [12])"hello world"

你可以看到这是一个 const char 数组,长度为12。

可是这里很明显只有11个字符,那为什么 const char 数组的长度是12呢?

原因是在这种情况下,在字符串的最后有一个额外的字符,一个空终止字符,它的 ASCII 码值为 0,可以写做 ‘\0’,是null字符的意思,表示字符串的结束。注意,这和字符0完全不一样。

如果我们想在这个字符串中间插入一个 \0,这样操作会破坏这个字符串的行为,让我们设置个断点查看下内存

 我在第五行设置了一个断点,当程序运行到第六行的时候,我们可以看到左边红框data = hello

这是为什么呢?

我们可以看到在 hello 和 world 的后面各有一个点,在 ACSII 中,点表示 0。它在最后标记字符串的结尾标记字符串的结尾。

如果我想看到我的字符串是什么,我可以运行 C 函数 strlen,计算一下这个字符串的长度,看看结果。

结果是5,可是明明字符串的长度不是5啊,得到这个结果的原因是它只计算直到 \0 之前的字符数。因为一旦它到0,它就认为是结束了,这就是字符串的结尾了。

这就是它现在的样子,是一个 const char* 。

我们也可以把它赋值给另一个 const char* ,这完全没问题。

const 保证了你不会操纵字符串。当然,如果不写 const,你是可以修改其中的字符的,不过我不建议你这样做,这可能会导致所谓的未定义行为,因为 C++ 标准并没有定义在这种情况下应该发生什么,因此,一些编译器可能会为此生成有效的代码,但是你不能依赖它,所以还是不要这样操作了,一些编译器甚至不会让你通过编译。

未定义是不被允许的,原因是你取了一个指向那个字符串的字面量的内存位置的指针,而字符串字面量是存储在内存的只读部分的,它是存储在二进制文件的 const 部分。当我们引用它的时候,实际上指的是一个我们不能编辑的常量区域。

测试的代码

#include <iostream>
#include <string.h>
int main()
{const char * data =  "hello\0 world";std::cout << strlen(data) << std::endl;std::cout << data << std::endl;return 0;
}

02 其他一些关于字符串的有趣的常识。

有一种叫做 wchar_t 的字符,也是就是所谓的宽字符。

现在快速的过一遍这些类型。

 注意,如果不加那个 L,是不能通过编译的。

会报下面的错误"const char *" 类型的值不能用于初始化 "const wchar_t *" 类型的实体C/C++(144)

上面的例子表示引号里的字符串字面值由宽字符组成。

C++ 还引入了一些其它的字符,比如 char16_t,你需要设置为小写 u,然后是双引号包含你的文本。还有 char32_t,这里是大写的 U,加上你的文本。

如果为了强调,你也可以将普通的 const char 前面加上 u8 前缀。有一些编译器设置可以控制是使用 char 还是使用 wchar。

做一个简单的总结:char 是一个字节的字符,也就是utf8;char16 是两个字节的16个比特的字符,也就是utf16;char32 是32比特,4字节的字符,也就是utf32。

2.1  wchar 和 char16 之间的区别是什么?

因为它们似乎都是两个字节的字符。

虽然我一直在说,一个字符是两个字节,实际情况是,这是由编译器决定的,它可能是一个字节,也可能是两个字节,也可能是四个字节,在实际应用中,好像还没有见过是一个字节的,通常不是2个就是4个,在 windows 上是2个字节,在 linux上是4个字节,mac 上也是四个字节。所以,这其实是一个变动的值,如果你确实要的是2个字节的,你就用 char16吧。

2.2 字符串附加。

在 C++14 中,有个 std::string_literals,它给出了一些方便的字符串函数。

如果你想在这个上面附加一些其它的字符串,你不能直接使用加号拼接一个字符串。因为这些都是字符串字面量,它们实际上是数组或者指针,所以不能将它们相加。在 C++14 的 string_literals 库中,有办法可以让事情变得更加简单一些。

你可以直接把字母 s 加到字符串的末尾,就像下面的例子一样。

如果你把鼠标悬浮在上面可以看到,它是一个操作符函数,返回标准字符串对象,类似的,你把 u8 放在前面,把 L 放在前面,可以得到对应的字符串,都是一样的道理。

我们还可以通过另外一种方法来附加字符串字面量,使用字母 R。

R 表示可以忽略转义字符,这样操作可以让这个过程变的简单了一些,因为如果没有它,要完成同的效果,我们需要把所有的这些东西都加在一起,或者我们也可以这样,直接加上 \n。

这种做法还是比较常见的,如果你想写一段完整的文本,或者代码中的某个字符串,你想简单的定义它的话就比较复杂了,所以 R 还是很有用的。

好了,以上就是字符串字常量。

#include <iostream>
#include <string.h>
int main()
{using namespace std::string_literals;const char * data =  "hello\0 world";const wchar_t   * data1 = L"hello world";const char16_t * data2 = u"hello world";const char32_t * data3 = U"hello world";std::string buf = "hello"s + "world";const char * buf2 =R"(hello
world
i am 
chenpi
)";const char * buf3 = "hello\n""world";std::cout << buf3 << std::endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/180606.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity针对XBOX,SWITCH,PS5手柄的适配踩坑

前言&#xff1a; 记录一点最近在做手柄适配问题的踩坑。 这里推荐一款Unity做手柄适配的插件->Rewired Rewired官方文档链接Rewired Documentation | Supported Controllers Rewired插件里面有个是Player类&#xff0c;这个类获取到当前玩家的输入设备&#xff0c;输入…

酷开系统 | 追求娱乐不止一种方式,酷开科技带你开启新体验!

在当今社会&#xff0c;娱乐方式多种多样&#xff0c;人们对于娱乐的需求和追求也在日益增长。然而&#xff0c;传统的娱乐方式已经无法满足大家对于多元化、个性化的体验需求。此时&#xff0c;酷开科技以其独特的视角和领先的技术&#xff0c;为消费者们带来了全新的娱乐体验…

【数据结构 —— 二叉树的链式结构实现】

数据结构 —— 二叉树的链式结构实现 1.树的概念及其结构1.1.树概念1.2.树的结构1.3树的相关概念1.4.树的表示1.5. 树在实际中的运用&#xff08;表示文件系统的目录树结构&#xff09; 2.二叉树的概念及其结构2.1二叉树的概念2.2.现实中的二叉树&#xff1a;2.3. 特殊的二叉树…

mysql 命令行导入sql 数据,windows导入,强制导入

线上用了polarDB&#xff0c; 本地导入的时候&#xff0c;通过navicat 的备份导入和执行sql文件的方式导入都失败了 用命令行的方式可以导入sql 当我用windows 的cmd 导入的时候&#xff0c;会报一些命令行的错误。 那其实我检查了这个命令是没有问题的。 mysql -uroot -p hu…

asp.net mvc游戏门户网站

c#asp.net mvc 说明文档 运行前附加数据库.mdf&#xff08;或sql生成数据库&#xff09; 主要技术&#xff1a; 基于asp.net mvc架构和sql server数据库&#xff0c;并采用EF实体模型开发三层架构BLL DAL 功能模块&#xff1a; 前端展示首页 新闻公告 英雄档案 视频图片 管理…

解决苹果手机iphone手机强制重启

强制关机&#xff1a; 方法1.同时按住左侧的&#xff0c;- 键中的一个和右侧的电源键 方法2.点击桌面的悬浮键–设备–更多–重新启动

Elasticsearch(一)

一&#xff1a;简介 The Elastic Stack, 包括 Elasticsearch、 Kibana&#xff08;展示数据的项目&#xff09;、 Beats 和 Logstash&#xff08;这两个是采集和传输数据的项目&#xff09; 这些项目组合形成的技术栈称为ELK Stack&#xff0c;能够安全可靠地获取任何来源、任…

想学计算机视觉入门的可以看过来了

文章写了有一段时间了&#xff0c;期间不少小伙伴来咨询如何自学入门AI&#xff0c;或者咨询一些AI算法。 90%的问题我都回复了&#xff0c;但有时确实因为太忙&#xff0c;没顾得过来。 在这个过程中&#xff0c;我发现很多小伙伴问的问题都类似&#xff1a;比如如何入门计算…

从 0 到 1 开发一个 node 命令行工具

G2 5.0 推出了服务端渲染的能力&#xff0c;为了让开发者更快捷得使用这部分能力&#xff0c;最写了一个 node 命令行工具 g2-ssr-node&#xff1a;用于把 G2 的 spec 转换成 png、jpeg 或者 pdf 等。基本的使用如下&#xff1a; $ g2-ssr-node g2png -i ./bar.json -o ./bar.…

Django RestFramework

安装restframework pip install djangorestframework pip install markdown # Markdown support for the browsable API. pip install django-filter # Filtering support安装其他模块 pip install pillowpip install django-cors-headers建模和迁移数据 drf包含四个…

Linux常用命令——basename命令

在线Linux命令查询工具 basename 打印目录或者文件的基本名称 补充说明 basename命令用于打印目录或者文件的基本名称。basename和dirname命令通常用于shell脚本中的命令替换来指定和指定的输入文件名称有所差异的输出文件名称。 语法 basename(选项)(参数)选项 --help&…

深度学习可解释性Python库

本文整理了10个常用于可解释AI的Python库&#xff0c;方便我们更好的理解AI模型的决策。 原文阅读 什么是XAI&#xff1f; XAI&#xff08;Explainable AI&#xff09;的目标是为模型的行为和决策提供合理的解释&#xff0c;这有助于增加信任、提供问责制和模型决策的透明度…

SAP_ABAP_编程基础_二进制文件_SMW0中上传与下载

SAP ABAP 顾问&#xff08;开发工程师&#xff09;能力模型_Terry谈企业数字化的博客-CSDN博客文章浏览阅读448次。目标&#xff1a;基于对SAP abap 顾问能力模型的梳理&#xff0c;给一年左右经验的abaper 快速成长为三年经验提供超级燃料&#xff01;https://blog.csdn.net/j…

(2)(2.1) Lightware SF40/C(360度)

文章目录 前言 1 安装SF40c 2 连接自动驾驶仪 3 通过地面站进行配置 4 参数说明 前言 Lightware SF40/C 360 度激光雷达(Lightware SF40/C 360degree lidar)可在 Copter-3.4 及更高版本的 Loiter 模式下用于物体回避。 &#xff01;Warning 该功能尚未在各种情况下进行过…

STM32F407-14.3.5-01捕获_比较通道

捕获/比较通道 每一个捕获/比较通道都是围绕着一个捕获/比较寄存器(包含影子寄存器) 包括: 捕获的输入部分(数字滤波、多路复用和预分频器)&#xff0c; 输出部分(比较器和输出控制)。 中文参考手册中框图分成了三大模块, 把框图合并成了一个整体,以便更好的理解捕获输…

分布式机器学习、联邦学习、多智能体的区别和联系——一文进行详细解释

1 分布式机器学习、联邦学习、多智能体介绍 最近这三个方面的论文都读过&#xff0c;这里写一篇博客归纳一下&#xff0c;以方便搞这几个领域的其他童鞋入门。我们先来介绍以下这三种机器学习范式的基本概念。 1.1 分布式机器学习介绍 分布式机器学习(distributed machine l…

除自身以外数组的乘积——力扣算法

题目 给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时…

再探Java集合系列—LinkedList

单向链表 双向链表 LinkedList适用于什么场景&#xff1f; 适用于需要频繁插入和删除元素的场景&#xff0c;例如消息聊天系统&#xff0c;一开始并不明确有多少记录&#xff0c;可以在空间满足的情况下不断增加数据 LinkedList的特点有哪些&#xff1f; LinkedList的底层采…

中兴小鲜50 ZTE 畅行50 刷机救砖演示机7543n root 虎贲 展锐 T760 解锁BL

系统信息 网络制式 支持中国移动、中国电信、中国联通、中国广电四大运营商5G频段&#xff1b;支持4G/3G/2G 系统平台 MyOS 13.0&#xff08;基于Android 13&#xff09; 硬件信息 处理器 展锐T760&#xff0c;高性能8核5G芯片 存储 6GB RAM128GB ROM 扩展 不支持 电池容…

【算法萌新闯力扣】:旋转链表

力扣题目&#xff1a;旋转链表 开篇 今天是备战蓝桥杯的第25天和算法村开营第3天&#xff01;经过这3天的学习&#xff0c;感觉自己对链表的掌握程度大大地提升&#xff0c;尤其是在帮村里的同学讨论相关问题时。本篇文章&#xff0c;给大家带来一道旋转链表的题目&#xff0c…