标准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 类本身并不强制或假设任何特定的编码。

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

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

相关文章

C++builder中的人工智能(28):FANN: Fast Artificial Neural Networks快速人工神经网络(ANNs)

这篇文章全面介绍了快速人工神经网络&#xff08;ANNs&#xff09;的世界&#xff0c;探讨了它们在现代计算智能中的重要地位、核心特点、应用领域以及未来发展。 快速人工神经网络库&#xff08;Fast Artificial Neural Network Library&#xff0c;简称FANN&#xff09;是一…

零基础Java第十六期:抽象类接口(二)

目录 一、接口&#xff08;补&#xff09; 1.1. 数组对象排序 1.2. 克隆接口 1.3. 浅拷贝和深拷贝 1.4. 抽象类和接口的区别 一、接口&#xff08;补&#xff09; 1.1. 数组对象排序 我们在讲一维数组的时候&#xff0c;使用到冒泡排序来对数组里的元素进行从小到大或从大…

wafw00f源码详细解析

声明 本人菜鸟一枚&#xff0c;为了完成作业&#xff0c;发现网上所有的关于wafw00f的源码解析都是这抄那那抄这的&#xff0c;没有新东西&#xff0c;所以这里给出一个详细的源码解析&#xff0c;可能有错误&#xff0c;如果有大佬发现错误&#xff0c;可以在评论区平和的指出…

Bilibili-超能用户榜入口优化-技术方案反思与总结

目录 客户端实现&#xff1a; 高能用户入口实现逻辑&#xff1a; 接口服务信息&#xff08;服务端下发&#xff09;&#xff1a; 执行方案&#xff1a; (1)数据类新增服务端下发字段 ​编辑 (2) UI添加 寻找思路&#xff1a; &#xff08;3&#xff09;超能用户icon显示…

终端打开程序、为什么要用pycharm

方法一&#xff1a;cd文件路径 方法二&#xff1a;输入cmd 为什么终端可以运行python代码&#xff0c;还需要pycharm&#xff1f;——让写代码的过程更加简单 学习视频&#xff1a;【最详细的 Windows 下 PyTorch 入门深度学习环境安装与配置 CPU GPU 版 | 土堆教程】https://w…

深度了解flink(十一) 心跳机制详解

前言 在Flink的各个服务组件中&#xff0c;ResourceManager、JobMaster、TaskExecutor三者之间存在相互检测的心跳机制&#xff1a;ResourceManager会主动发送心跳请求探测JobMaster、TaskExecutor是否存活&#xff1b;JobMaster也会主动发送心跳请求探测TaskExecutor是否存活…

华为策略路由配置

一、本地策略路由 要求&#xff1a; 长度为64~1400字节的报文走g0/0/0链路 长度为1401~1500字节的报文走g0/0/1链路 1.启动设备 2.配置IP地址 [AR1]int g0/0/0 [AR1-GigabitEthernet0/0/0]ip add 150.1.1.1 24 [AR1-GigabitEthernet0/0/0]int g0/0/1 [AR1-GigabitEther…

Html Area 图像映射可点击区域 实现响应式图像映射

Html Area 图像映射可点击区域 实现响应式图像映射 主要实现了图片的分区域点击&#xff0c;可以自定义点击的区域&#xff0c;根据点击的位置不同&#xff0c;执行不同的方法或者跳转不同的网页 介绍 引用w3school的Demohttps://www.w3school.com.cn/tags/tag_area.asp#googl…

Python爬虫知识体系-----requests-----持续更新

数据科学、数据分析、人工智能必备知识汇总-----Python爬虫-----持续更新&#xff1a;https://blog.csdn.net/grd_java/article/details/140574349 文章目录 一、安装和基本使用二、get请求三、post请求四、代理 一、安装和基本使用 和解析库urllib几乎一摸一样&#xff0c;但是…

操作系统OS--进程

目录 操作系统是什么 进程 进程的状态 1.并行和并发 2.时间片 进程优先级 进程切换 task_struct内容分类&#xff1a; 操作系统是什么 操作系统本质上是一款纯正的“搞管理”的软件 你的程序不能直接写入硬件&#xff0c;都必须通过操作系统 对软硬件之间进行交互&…

C语言 strlen 函数 - C语言零基础入门教程

目录 一.strlen 函数简介二.strlen 函数实战三.猜你喜欢 零基础 C/C 学习路线推荐 : C/C 学习目录 >> C 语言基础入门 一.strlen 函数简介 在C 语言中&#xff0c;char 字符串也是一种非常重要的数据类型&#xff0c;我们可以使用 strlen 函数获取字符串长度&#xff1b;…

地面沉降数值模拟的最新进展与研究动态

地面沉降&#xff0c;由自然或人为因素引起的地表垂直位移现象&#xff0c;对城市规划、交通基础设施、建筑工程和环境地质学等多个领域产生深远影响。它不仅威胁着城市建筑安全和交通运行&#xff0c;还对环境和经济发展构成挑战。掌握地面沉降的理论知识和实践技能至关重要。…

如何选择适合的谷歌SEO服务避免踩坑?

在选择SEO服务时&#xff0c;很多企业担心花了钱却看不到效果。市面上确实有一些不靠谱的服务商&#xff0c;他们承诺短时间内实现排名飙升&#xff0c;但最终结果往往不尽如人意。那么&#xff0c;如何判断SEO服务的真假呢 首先&#xff0c;靠谱的SEO公司一定能提供真实的案例…

【OpenGL】OpenGL简介

文章目录 OpenGL概述OpenGL的本质OpenGL相关库核心库窗口管理glutfreeglutglfw 函数加载glewGLAD OpenGL概述 OpenGL(Open Graphics Library) 严格来说&#xff0c;本身并不是一个API&#xff0c;它是一个由Khronos组织制定并维护的规范(Specification)。OpenGL规范严格规定了…

算法闭关修炼百题计划(六)

塔塔开(滑稽 1.删除排序链表中的重复元素2.删除排序链表中的重复元素II3.字典序的第k小数字4.下一个排列5.排序链表6.随机链表的复制7.数据流的中位数 1.删除排序链表中的重复元素 使每个元素就出现一次 class Solution { public:ListNode* deleteDuplicates(ListNode* head)…

实习冲刺第二十天

543.二叉树的直径 给你一棵二叉树的根节点&#xff0c;返回该树的 直径 。 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。 两节点之间路径的 长度 由它们之间边数表示。 示例 1&#xff1a; 输入&#xff1a;root …

搜索引擎算法解析提升搜索效率的关键要素

内容概要 搜索引擎算法是指一系列计算机程序和规则&#xff0c;用于决定如何抓取、索引和提供网页信息。了解这些算法的核心概念对于提高我们的搜索效率至关重要。本文将详细分析搜索引擎的工作原理和主要算法类型&#xff0c;以及它们如何影响搜索结果的准确性和用户体验。 …

Brave127编译指南 Windows篇:配置Git(四)

1. 概述 在Brave浏览器的开发过程中&#xff0c;Git作为核心版本控制工具扮演着不可或缺的角色。作为当今最广泛使用的分布式版本控制系统&#xff0c;Git为开发者提供了强大的源码管理能力。通过Git&#xff0c;您可以轻松追踪代码变更、管理不同版本&#xff0c;并与其他开发…

使用React和Vite构建一个AirBnb Experiences克隆网站

这一篇文章中&#xff0c;我会教你如何做一个AirBnb Experiences的克隆网站。主要涵盖React中Props的使用。 克隆网站最终呈现的效果&#xff1a; 1. 使用vite构建基础框架 npm create vitelatestcd airbnb-project npm install npm run dev2. 构建网站的3个部分 网站从上…

LC68----222. 完全二叉树的节点个数(java版)---树

1. 题目描述 完全二叉树的节点个数 给你一棵 完全二叉树 的根节点 root &#xff0c;求出该树的节点个数。 完全二叉树 的定义如下&#xff1a;在完全二叉树中&#xff0c;除了最底层节点可能没填满外&#xff0c;其余每层节点数都达到最大值&#xff0c;并且最下面一层的节点…