P24 C++ 字符串常量

news2024/11/25 11:46:33

前言

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

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

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.coloradmin.cn/o/1265270.html

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

相关文章

Linux CentOS_7解决无法上网的问题

参考视频&#xff1a;保姆式教学虚拟机联网liunx(centos)_哔哩哔哩_bilibili 配置网络&#xff1a;解决上网问题 第一步&#xff1a;选择网络模式 第二步&#xff1a;配置网卡命令&#xff1a;打开终端执行命令&#xff1a; 1、先切换到根目录下&#xff0c;防止在第执行cd …

计网Lesson4 - 计算机组网模型

文章目录 计算机的连接方式1. 两台计算机的互联2. 多台计算机的互联&#xff08;旧式&#xff09;3. 多台计算机的互联 --- 集线器&#xff08;Hub&#xff09;4. 网桥5. 多台计算机的互联 --- 交换器&#xff08;Switch&#xff09; 计算机的连接方式 1. 两台计算机的互联 网…

什么是路由抖动?该如何控制

路由器在实现不间断的网络通信和连接方面发挥着重要作用&#xff0c;具有所需功能的持续可用的路由器可确保其相关子网的良好性能&#xff0c;由于网络严重依赖路由器的性能&#xff0c;因此确保您的路由器不会遇到任何问题非常重要。路由器遇到的一个严重的网络问题是路由抖动…

如何使用APP UI自动化测试提高测试效率与质量?

pythonappium自动化测试系列就要告一段落了&#xff0c;本篇博客咱们做个小结。 首先想要说明一下&#xff0c;APP自动化测试可能很多公司不用&#xff0c;但也是大部分自动化测试工程师、高级测试工程师岗位招聘信息上要求的&#xff0c;所以为了更好的待遇&#xff0c;我们还…

第15关 K8s HPA:自动水平伸缩Pod,实现弹性扩展和资源优化

------> 课程视频同步分享在今日头条和B站 大家好&#xff0c;我是博哥爱运维&#xff0c;这节课带来k8s的HPA 自动水平伸缩pod&#xff08; 视频后面有彩蛋 : ) &#xff09;。 我们知道&#xff0c;初始Pod的数量是可以设置的&#xff0c;同时业务也分流量高峰和低峰&a…

Java 8 中 ReentrantLock 与 Synchronized 的区别

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f33a; 仓库主页&#xff1a; Gitee &#x1f4ab; Github &#x1f4ab; GitCode &#x1f496; 欢迎点赞…

【安装指南】MySQL和Navicat下载、安装及使用详细教程

目录 ⛳️1.【MySQL】安装教程 1.1 获取下载包 1.2 MySQL安装 1.2.1 MySQL工具安装 1.2.2 MySQL环境变量 1.2.3 验证MySQL安装成功 ⛳️2.【Navicat-v15】的安装和无限使用 ⛳️3.【测试Navicat连接MySQL】 ⛳️1.【MySQL】安装教程 1.1 获取下载包 前往官网获取压缩包…

C#Backgroundworker与Thread的区别

前言 当谈到多线程编程时&#xff0c;C#中的BackgroundWorker和Thread是两个常见的选择。它们都可以用于实现并行处理和异步操作&#xff0c;但在某些方面有一些重要的区别。本文将详细解释BackgroundWorker和Thread之间的区别以及它们在不同场景中的使用。 目录 前言1. Backgr…

蓝桥杯每日一题2023.11.28

题目描述 三羊献瑞 - 蓝桥云课 (lanqiao.cn) 题目分析 本题首先进行观察可以确定 1.“三”为 1 &#xff08;十进制数字要进位进一位&#xff09; 2.“祥”一定不为 0 &#xff08;有前导0就不能算为 4 位数&#xff09; 使用搜索时将其特判 #include<bits/stdc.h> …

商用车的智慧眼车规级激光雷达

1、商用车自动驾驶技术&#xff1a;巨大的降本增效空间 2、感知是第一步&#xff1a;看懂环境路况才能安全的自动驾驶 3、多传感器融合&#xff0c;感知信息冗余&#xff0c;保障自动驾驶安全 4、商用车需要什么样的激光雷达 5、车规级激光雷达的软硬件成熟度及延展性 &#x…

Joint Bilateral Upsampling

Abstract 图像分析和增强任务&#xff08;例如色调映射、着色、立体深度和蒙太奇&#xff09;通常需要在像素网格上计算解决方案&#xff08;例如&#xff0c;曝光、色度、视差、标签&#xff09;。计算和内存成本通常要求在下采样图像上运行较小的解决方案。尽管通用上采样方…

leetcode:455. 分发饼干

一、题目 原题链接&#xff1a;455. 分发饼干 - 力扣&#xff08;LeetCode&#xff09; 函数原型&#xff1a;int findContentChildren(int* g, int gSize, int* s, int sSize) 二、思路 将胃口数组和饼干尺寸数组降序排序 遍历两个数组&#xff0c;从胃口数组中找到符合饼干尺…

【古月居《ros入门21讲》学习笔记】15_ROS中的坐标系管理系统

目录 说明&#xff1a; 1. 机器人中的坐标变换 tf功能包能干什么&#xff1f; tf坐标变换如何实现 2. 小海龟跟随实验 安装 ros-melodic-turtle-tf 实验命令 运行效果 说明&#xff1a; 1. 本系列学习笔记基于B站&#xff1a;古月居《ROS入门21讲》课程&#xff0c;且使…

Kafka事务机制:原理和实践

Kafka事务机制&#xff1a;原理和实践 Apache Kafka 是一个分布式流处理平台&#xff0c;广泛用于构建实时数据管道和流应用程序。它不仅以高吞吐量、可扩展性和容错能力著称&#xff0c;还提供了事务支持&#xff0c;以确保数据的完整性和一致性。在这篇博客中&#xff0c;我…

51单片机使用串口查看程序执行的数据

51单片机使用串口查看程序执行的数据 1.概述 这篇文章介绍利用串口输出程序执行的数据&#xff0c;辅助我们调试程序&#xff0c;提高代码定位问题的效率。 2.硬件电路原理 3.串口助手查看程序数据 输出串口数据的方式分为CPU查询方式和中断方式。他们各有优缺点&#xff0…

C语言 移位操作符

<< 左移操作符>> 右移操作符 注&#xff1a;移位操作符的操作数只能是整数。 移位操作符移动的是二进制位。 整数的二进制表示有3种&#xff1a; 原码反码补码 正的整数的原码、反码、补码相同。 负的整数的原码、反码、补码是要计算的。 由负整数原码计算出反…

计网Lesson3 - 计算机网络评价指标与封包解包

文章目录 计算机网络的性能指标1. 速率2. 带宽3. 吞吐量4. 时延5. 时延带宽积6. 往返时间7. 利用率8. 数据的解包和封包 计算机网络的术语实体![实体](https://img-blog.csdnimg.cn/direct/cbf4ca9ed5ab4df290b5a17b4642c6a1.png)协议服务 计算机网络的性能指标 1. 速率 数据…

linux CentOS MobaXterm 通过X11 Forwarding 在本地开启图形可视化窗口

第一步 操作系统安装图形界面 X11 Forwarding dnf install xorg-x11-xauth xorg-x11-fonts-* xorg-x11-font-utils xorg-x11-fonts-Type1 xclock第二步 修改参数&#xff0c;启用X11 Forwarding vim /etc/ssh/sshd_config修改参数X11Forwarding yes和X11UseLocalhost no #Al…

【专题】支持向量机(Support Vector Machines,SVM)

​​​​​ ​​ 支持向量机&#xff08;Support Vector Machines&#xff0c;SVM&#xff09;是一种强大的监督学习模型&#xff0c;常用于分类、回归和异常值检测任务。它的核心思想是通过构建一个最大间隔超平面来有效地分隔不同类别的数据点。 在SVM中&#xff0c;数据点…

编写安全 JavaScript 代码的最佳实践

编写安全 JavaScript 代码的最佳实践 JavaScript 的动态特性使其成为事实上的浏览器语言和世界上最流行的编程语言。 JS 最受欢迎的有用功能之一是即时分析。这意味着浏览器在下载内容的同时执行代码&#xff0c;这显然有其优势。然而&#xff0c;这种程度的自由也伴随着问题…