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

标准C++ 字符串

一、标准库中的字符串类型

在C++中,字符串是一个非常重要的数据类型,用于表示和处理文本信息。C++提供了多种方式来处理字符串,每种方式都有其特点和适用场景。以下是几种常见的字符串类型及其用法:

1. C 风格字符串 (char*char[])

C 风格字符串是最基础的字符串表示方式,它是一个以空字符 \0 结尾的字符数组。

char str1[] = "Hello, World!";
char* str2 = "Hello, World!";

特点:

  • 直接使用字符数组,简单高效。
  • 没有内置的长度检查,容易发生缓冲区溢出等问题。
  • 需要手动管理内存。

示例:

#include <iostream>
#include <cstring> // for strlen, strcpy, etc.int main() {char str1[] = "Hello, World!";char str2[50];std::cout << "Length of str1: " << strlen(str1) << std::endl;strcpy(str2, str1); // Copy str1 to str2std::cout << "str2: " << str2 << std::endl;return 0;
}

2. std::string(C++ 标准库)

C++标准库中的<string>头文件定义了std::string类,提供了丰富的成员函数和操作符重载,使得字符串处理更加方便和安全。

#include <string>
#include <iostream>int main() {std::string str1 = "Hello, World!";std::string str2 = str1 + " How are you?";std::cout << "str1: " << str1 << std::endl;std::cout << "str2: " << str2 << std::endl;std::cout << "Length of str2: " << str2.length() << std::endl;return 0;
}

特点:

  • 类型安全:避免缓冲区溢出等安全问题。
  • 动态管理内存,不需要手动释放。
  • 提供了丰富的成员函数,如 length(), substr(), find(), replace() 等。
  • 支持字符串拼接、比较等操作。
  • 支持移动语义,允许更高效地处理临时字符串。
  • 可以从其他字符串、字符数组、字符指针以及初始化列表构造字符串。
  • C++ 新增成员函数
  •   `shrink_to_fit()`:减少内存使用,将容量减少到与大小相同。
    
  •   `to_string()`:将数值类型转换为字符串。
    
  •   `stoi()`, `stol()`, `stoll()`, `stof()`, `stod()`, `stold()`:字符串到数值的转换函数。
    

3. 字符串字面量

C++ 11引入了原始字符串字面量,它允许字符串字面量包含任意字符,包括换行符、制表符和引号,而不需要进行转义。原始字符串字面量以 R"(...)" 的形式书写,例如:

const char* raw_str = R"(Hello "World"
This is a raw string literal)";

4. 宽字符字符串1 wchar_t*wchar_t[]

宽字符字符串用于处理多字节字符集,如 Unicode。它们使用 wchar_t 类型来存储字符。

wchar_t wstr1[] = L"Hello, World!";
wchar_t* wstr2 = L"Hello, World!";

特点:

  • 每个字符占用多个字节,适合处理多字节字符集。
  • 使用 wchar_t 类型,需要特殊的函数来处理,如 wcslen, wcscpy 等。

示例:

#include <iostream>
#include <cwchar> // for wcslen, wcscpy, etc.int main() {wchar_t wstr1[] = L"Hello, World!";wchar_t wstr2[50];std::wcout << L"Length of wstr1: " << wcslen(wstr1) << std::endl;wcscpy(wstr2, wstr1); // Copy wstr1 to wstr2std::wcout << L"wstr2: " << wstr2 << std::endl;return 0;
}

5. 宽字符字符串2 std::wstring

std::wstringstd::string 的宽字符版本,用于处理宽字符字符串。

#include <string>
#include <iostream>int main() {std::wstring wstr1 = L"Hello, World!";std::wstring wstr2 = wstr1 + L" How are you?";std::wcout << L"wstr1: " << wstr1 << std::endl;std::wcout << L"wstr2: " << wstr2 << std::endl;std::wcout << L"Length of wstr2: " << wstr2.length() << std::endl;return 0;
}

Unicode 字符串字面量

C++ 11支持Unicode字符串字面量,允许使用 Unicode 字符集编写字符串字面量。可以使用 u8 前缀表示UTF-8编码,u 前缀表示UTF-16编码,U 前缀表示UTF-32编码。例如:

const char* utf8_str = u8"Hello, 世界"; // UTF-8
const char16_t* utf16_str = u"Hello, 世界"; // UTF-16
const char32_t* utf32_str = U"Hello, 世界"; // UTF-32

特点:

  • 动态管理内存,不需要手动释放。
  • 提供了丰富的成员函数,如 length(), substr(), find(), replace() 等。
  • 支持宽字符字符串的拼接、比较等操作。

6. std::u16stringstd::u32string

从 C++11 开始,标准库引入了 std::u16stringstd::u32string,分别用于处理 16 位和 32 位的 Unicode 字符串。

#include <string>
#include <iostream>int main() {std::u16string u16str1 = u"Hello, World!";std::u32string u32str1 = U"Hello, World!";std::cout << "u16str1: " << std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t>().to_bytes(u16str1) << std::endl;std::cout << "u32str1: " << std::wstring_convert<std::codecvt_utf8<char32_t>, char32_t>().to_bytes(u32str1) << std::endl;return 0;
}

特点:

  • 分别使用 char16_tchar32_t 类型来存储字符。
  • 适用于处理 UTF-16 和 UTF-32 编码的字符串。
  • 需要使用 std::wstring_convert 进行编码转换。

总结

  • C 风格字符串:简单高效,但容易出错。
  • std::string:功能丰富,使用方便,安全性高。
  • 宽字符字符串:适用于多字节字符集,如 Unicode。
  • std::wstringstd::string 的宽字符版本。
  • std::u16stringstd::u32string:适用于 UTF-16 和 UTF-32 编码的字符串。

选择合适的字符串类型取决于你的具体需求,例如是否需要处理多字节字符集、是否需要更高的安全性等。

二、 常用字符串操作

以下是一些常用的字符串操作:

  • 构造和赋值:

    std::string str1 = "Hello";
    std::string str2(str1); // 拷贝构造
    std::string str3 = str1 + ", World!"; // 字符串连接
    
  • 长度和容量:

    size_t length = str.length(); // 或 str.size()
    size_t capacity = str.capacity();
    
  • 修改字符串:

    str.append("append this"); // 在末尾添加字符串
    str.insert(7, "inserted "); // 在指定位置插入字符串
    str.erase(5, 3); // 删除指定位置的字符
    str.replace(5, 3, "replaced"); // 替换指定位置的字符
    
  • 查找和比较:

    size_t found = str.find("World"); // 查找子串
    bool equal = (str1 == str2); // 比较字符串
    
  • 子串提取:

    std::string substr = str.substr(7, 5); // 提取子串
    
  • 字符访问:

      std::string str = "Hello, World!";// 通过索引访问字符串中的字符for (size_t i = 0; i < str.size(); ++i) {std::cout << "Character at index " << i << " is: " << str[i] << std::endl;}
    
  • 字符串流:
    C++还提供了字符串流(std::istringstreamstd::ostringstreamstd::stringstream),可以用于字符串的格式化输入输出操作。

#include <sstream>
std::ostringstream oss;
oss << "Hello" << ", " << "World!";
std::string formatted_str = oss.str();

这些是C++中处理字符串的基本方式。在实际编程中,std::string因其易用性和安全性而成为处理字符串的首选方式。

std::getline 的增强

std::getline 函数现在可以接受任何输入流和字符串,而不仅仅是 std::string。这使得从流中读取数据更加灵活。

正则表达式库

C++ 11引入了 <regex> 库,它提供了一种使用正则表达式处理字符串的方式。这个库包括正则表达式类型 std::regex 和用于匹配、查找和替换的函数。

自动类型推导

C++ 11引入了 auto 关键字,可以用于自动推导变量的类型,这在处理字符串迭代器时非常有用,因为它们通常很长且难以记忆。

for (auto it = str.begin(); it != str.end(); ++it) {// 使用迭代器
}

以上是C++ 11中字符串相关的一些主要特性。这些特性极大地提高了字符串处理的灵活性和便利性,使得C++在文本处理方面的能力得到了显著增强。

std::string 的编码格式

std::string 是 C++ 标准库中的一个类,用于表示和处理字符串。在 std::string 中,字符串的编码格式并不是由 std::string 类本身决定的,而是由字符串中存储的数据和程序解释这些数据的方式决定的。
以下是一些关于 std::string 编码格式的要点:

  1. 字符类型std::string 存储的是一系列字符,这些字符默认是 char 类型。在大多数系统上,char 是一个字节(8位),并且可以用来存储 ASCII 编码的字符。
  2. ASCII 编码:如果 std::string 仅包含 ASCII 字符(即字符值在 0 到 127 之间),则它通常被解释为 ASCII 编码。ASCII 是一个单字节编码方案,能够表示英文字母、数字和一些特殊符号。
  3. 扩展 ASCII 编码:有时 std::string 可能包含扩展 ASCII 字符(字符值在 128 到 255 之间),这取决于系统的本地编码设置。扩展 ASCII 允许表示更多的字符,例如重音符号和其他语言的一些字符。
  4. 多字节编码:如果 std::string 用于表示非 ASCII 字符,如 Unicode 字符,那么字符串可能使用多字节编码方案,如 UTF-8、UTF-16 或 UTF-32。在这些编码方案中,不同的字符可能占用不同数量的字节。
    • UTF-8:是一种变长编码,使用 1 到 4 个字节表示一个 Unicode 字符。它是网络传输中最常用的编码格式,并且与 ASCII 编码向后兼容。
    • UTF-16:是另一种变长编码,使用 2 或 4 个字节表示一个 Unicode 字符。
    • UTF-32:使用固定 4 个字节表示一个 Unicode 字符。
  5. 编码的独立性std::string 类本身并不关心字符串内部的编码格式。当你在 std::string 中存储字符时,它仅仅是将这些字符作为字节序列来处理。因此,如果需要处理特定的编码格式,程序员需要确保正确地编码和解码字符串。
  6. 编码转换:在实际应用中,你可能需要将 std::string 从一种编码转换为另一种编码。这通常需要使用专门的库,如 ICU(International Components for Unicode)或者 C++11 以后的标准库中的 <codecvt> 头文件(尽管 <codecvt> 在 C++17 中已被弃用)。
  7. 字符串字面量:在 C++ 中,字符串字面量(如 "Hello, World!")默认是 ASCII 编码的。但是,C++11 引入了 Unicode 字符串字面量,允许使用前缀 u(UTF-16)、U(UTF-32)和 u8(UTF-8)来表示不同编码的字符串。
    总之,std::string 的编码格式取决于你的程序如何解释存储在其中的字节序列,而 std::string 类本身并不强制或假设任何特定的编码。

相关文章:

标准C++ 字符串

一、标准库中的字符串类型 在C中&#xff0c;字符串是一个非常重要的数据类型&#xff0c;用于表示和处理文本信息。C提供了多种方式来处理字符串&#xff0c;每种方式都有其特点和适用场景。以下是几种常见的字符串类型及其用法&#xff1a; 1. C 风格字符串 (char* 或 char…...

时序预测:多头注意力+宽度学习

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…...

day06(单片机)IIC+STH20

目录 IICSHT20 I2C基础简介 为什么I2C需要使用上拉电阻&#xff1f; I2C特点 时序图分析 起始信号与终止信号 数据传输时序 字节传输和应答信号 I2C寻址 主机给从机发送一个字节 主机给从机发送多个字节 主机从从机接收一个字节 主机从从机接收多个字节 I2C寄存器 I2C_RXDR&…...

Bugku CTF_Web——文件上传

Bugku CTF_Web——文件上传 进入靶场 My name is margin,give me a image file not a php抓个包上传试试 改成png也上传失败 应该校验了文件头 增加了文件头也不行 试了一下 把文件类型改成gif可以上传 但是还是不能连接 将Content-Type改大小写 再把文件后缀名改成php4 成…...

C#版使用融合通信API发送手机短信息

目录 功能实现 范例运行环境 实现范例 类设计 类代码实现 调用范例 总结 功能实现 融合云通信服务平台&#xff0c;为企业提供全方位通信服务&#xff0c;发送手机短信是其一项核心功能&#xff0c;本文将讲述如何使用融合云服务API为终端手机用户发送短信信息&#xf…...

人工智能:重塑医疗、企业与生活的未来知识管理——以HelpLook为例

一、医疗行业&#xff1a;AI引领的医疗革新 随着人工智能&#xff08;AI&#xff09;技术的持续飞跃&#xff0c;我们正身处一场跨行业的深刻变革之中。在医疗健康的广阔舞台上&#xff0c;人工智能技术正扮演着日益重要的角色。它不仅能够辅助医生进行病例的精准诊断&#xf…...

MVVM(Model-View-ViewModel)模型

MVVM&#xff08;ModelViewViewModel&#xff09;模型是一种常用于软件开发中的架构模式&#xff0c;尤其在前端框架&#xff08;如 Vue.js、React、Angular&#xff09;中被广泛应用。它将程序的用户界面与业务逻辑分离&#xff0c;便于维护和扩展。 MVVM 的三个组成部分 1. …...

权限系统:权限应用服务设计

今天聊聊权限系统的应用服务设计。 从业务需求的角度来看&#xff0c;权限系统需要解决两个核心问题&#xff1a; 1、菜单渲染与动态展示 当用户成功登录并接入系统后&#xff0c;系统需要动态获取并展示该用户有权限访问的菜单项。 这一过程涉及前端系统与权限系统的交互。前端…...

Android音频架构

音频基础知识 声音有哪些重要属性呢&#xff1f; 响度(Loudness) 响度就是人类可以感知到的各种声音的大小&#xff0c;也就是音量。响度与声波的振幅有直接关系。 音调(Pitch) 音调与声音的频率有关系&#xff0c;当声音的频率越大时&#xff0c;人耳所感知到的音调就越高&a…...

AI 智享直播:开启直播新篇,引领未来互动新趋势!

在数字化浪潮席卷全球的今天&#xff0c;AI技术正以不可阻挡之势渗透进我们生活的方方面面&#xff0c;从智能家居到自动驾驶&#xff0c;从医疗健康到金融服务&#xff0c;无一不彰显着其强大的影响力和无限的潜力。而在这一波科技革新的洪流中&#xff0c;直播行业也迎来了前…...

【AIGC】国内AI工具复现GPTs效果详解

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | GPTs应用实例 文章目录 &#x1f4af;前言&#x1f4af;本文所要复现的GPTs介绍&#x1f4af;GPTs指令作为提示词在ChatGPT实现类似效果&#x1f4af;国内AI工具复现GPTs效果可能出现的问题解决方法解决后的效果 &#x1…...

Charles抓https包-配置系统证书(雷电)

1、导出证书 2、下载 主页上传资源中有安装包&#xff0c;免费的 openssl 安装教程自己搜 openssl x509 -subject_hash_old -in charles.pem 3、修改证书名、后缀改成点0 雷电打开root和磁盘写入 4、导入雷电证书根目录 证书拖进去&#xff0c;基本就完成了&#xff…...

在卷积神经网络中真正占用内存的是什么

在卷积神经网络&#xff08;CNN&#xff09;中&#xff0c;占用内存的主要部分包括以下几个方面&#xff1a; 1. 模型参数&#xff08;Weights and Biases&#xff09; CNN 中的权重和偏置&#xff08;即模型的参数&#xff09;通常是占用内存的最大部分。具体来说&#xff1…...

2024 ECCV | DualDn: 通过可微ISP进行双域去噪

文章标题&#xff1a;《DualDn: Dual-domain Denoising via Differentiable ISP》 论文链接&#xff1a; DualDn 代码链接&#xff1a; https://openimaginglab.github.io/DualDn/ 本文收录于2024ECCV&#xff0c;是上海AI Lab、浙江大学、香港中文大学&#xff08;薛天帆等…...

Elasticsearch 和 Kibana 8.16:Kibana 获得上下文和 BBQ 速度并节省开支!

作者&#xff1a;来自 Elastic Platform Product Team Elastic Search AI 平台&#xff08;Elasticsearch、Kibana 和机器学习&#xff09;的 8.16 版本包含大量新功能&#xff0c;可提高性能、优化工作流程和简化数据管理。 使用更好的二进制量化 (Better Binary Quantizatio…...

Linux 抓包工具 --- tcpdump

序言 在传输层 Tcp 的学习中&#xff0c;我们了解了 三次握手和四次挥手 的概念&#xff0c;但是看了这么多篇文章&#xff0c;我们也只是停留在 纸上谈兵。  欲知事情如何&#xff0c;我们其实可以尝试去看一下具体的网络包的信息。在这篇文章中将向大家介绍&#xff0c;在 L…...

Vector Optimization – Stride

文章目录 Vector优化 – stride跳跃Vector优化 – stride跳跃 This distance between memory locations that separates the elements to be gathered into a single register is called the stride. A stride of one unit is called a unit-stride. This is equivalent to se…...

git config是做什么的?

git config是做什么的&#xff1f; git config作用配置级别三种配置级别的介绍及使用&#xff0c;配置文件说明 使用说明git confi查看参数 默认/不使用这个参数 情况下 Git 使用哪个配置等级&#xff1f; 一些常见的行为查看配置信息设置配置信息删除配置信息 一些常用的配置信…...

计算机网络(7) 数据链路层

数据链路层的内容不学不知道&#xff0c;一学真的是吓一跳哦&#xff0c;内容真的挺多的&#xff0c;但是大家不要害怕&#xff0c;总会学完的。 还有由于数据链路层的内容太多&#xff0c;一篇肯定是讲不完的所以我决定把它分为好几个部分进行学习与讲解。大家可以关注以后文…...

2024年秋国开电大《建筑结构试验》形考任务1-4

形考作业一 1.下列选项中,( )项不属于科学研究性试验。 答案:检验结构的质量,说明工程的可靠性 2.下列各项,( )项不属于工程鉴定性试验。 答案:验证结构计算理论的假定 3.按试验目的进行分类,可将结构试验分成( )。 答案:工程鉴定性试验和科学研究性试验…...

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周&#xff0c;有很多同学在写期末Java web作业时&#xff0c;运行tomcat出现乱码问题&#xff0c;经过多次解决与研究&#xff0c;我做了如下整理&#xff1a; 原因&#xff1a; IDEA本身编码与tomcat的编码与Windows编码不同导致&#xff0c;Windows 系统控制台…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录&#xff0c;以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式

今天是关于AI如何在教学中增强学生的学习体验&#xff0c;我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育&#xff0c;这并非炒作&#xff0c;而是已经发生的巨大变革。教育机构和教育者不能忽视它&#xff0c;试图简单地禁止学生使…...

pycharm 设置环境出错

pycharm 设置环境出错 pycharm 新建项目&#xff0c;设置虚拟环境&#xff0c;出错 pycharm 出错 Cannot open Local Failed to start [powershell.exe, -NoExit, -ExecutionPolicy, Bypass, -File, C:\Program Files\JetBrains\PyCharm 2024.1.3\plugins\terminal\shell-int…...

基于鸿蒙(HarmonyOS5)的打车小程序

1. 开发环境准备 安装DevEco Studio (鸿蒙官方IDE)配置HarmonyOS SDK申请开发者账号和必要的API密钥 2. 项目结构设计 ├── entry │ ├── src │ │ ├── main │ │ │ ├── ets │ │ │ │ ├── pages │ │ │ │ │ ├── H…...

【安全篇】金刚不坏之身:整合 Spring Security + JWT 实现无状态认证与授权

摘要 本文是《Spring Boot 实战派》系列的第四篇。我们将直面所有 Web 应用都无法回避的核心问题&#xff1a;安全。文章将详细阐述认证&#xff08;Authentication) 与授权&#xff08;Authorization的核心概念&#xff0c;对比传统 Session-Cookie 与现代 JWT&#xff08;JS…...

Linux 内存管理调试分析:ftrace、perf、crash 的系统化使用

Linux 内存管理调试分析&#xff1a;ftrace、perf、crash 的系统化使用 Linux 内核内存管理是构成整个内核性能和系统稳定性的基础&#xff0c;但这一子系统结构复杂&#xff0c;常常有设置失败、性能展示不良、OOM 杀进程等问题。要分析这些问题&#xff0c;需要一套工具化、…...