标准C++ 字符串

news2024/11/13 18:03:14

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

在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 str2
    std::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 wstr2
    std::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.coloradmin.cn/o/2239560.html

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

相关文章

谷歌浏览器的自动翻译功能如何开启

在当今全球化的网络环境中&#xff0c;能够流畅地浏览不同语言的网页是至关重要的。谷歌浏览器&#xff08;Google Chrome&#xff09;提供了一项强大的自动翻译功能&#xff0c;可以帮助用户轻松跨越语言障碍。本文将详细介绍如何开启和使用谷歌浏览器的自动翻译功能&#xff…

中文书籍对《人月神话》的引用(161-210本):微软的秘密

中文书籍对《人月神话》的引用&#xff08;第001到160本&#xff09;>> 《人月神话》于1975年出版&#xff0c;1995年出二十周年版。自出版以来&#xff0c;该书被大量的书籍和文章引用&#xff0c;直到现在热潮不退。 2023年&#xff0c;清华大学出版社推出《人月神话》…

Docker了解

Docker是一种容器化技术&#xff0c;它可以将应用程序和其依赖项打包到一个独立的、可移植的容器中&#xff0c;以便在不同的环境中运行。Docker基于Linux操作系统的容器化技术&#xff0c;可以提供更轻量、更快速、更灵活、更一致的应用部署和管理方式。 Docker的基本概念包括…

【LLM Agents体验 3】利用Open-WebUI+Ollama本地部署Qwen2.5:7B大模型的安装指南

Open WebUI是一种基于 Web 的用户界面&#xff0c;用于管理和操作各种本地和云端的人工智能模型。它提供了一个直观的图形化界面&#xff0c;使用户可以方便地加载、配置、运行和监控各种 AI 模型&#xff0c;而无需编写代码或使用命令行界面。 Open-WebUI 是一款功能强大且易于…

新Activity启动时Task的位置(分屏场景)

目录 场景 场景 当类似上面的Task状态&#xff0c;我们自定义的三个按钮&#xff0c;启动新的Activity的时候&#xff0c;并没有去设置需要launche的task。 Intent intent new Intent();intent.setComponent(new ComponentName("com.android.dialer","com.and…

GitLab基于Drone搭建持续集成(CI/CD)

本文介绍了如何为 Gitee 安装 Drone 服务器。服务器打包为在 DockerHub 上分发的最小 Docker 映像。 1. 准备工作 创建OAuth应用 创建 GitLab OAuth 应用。Consumer Key 和 Consumer Secret 用于授权访问极狐GitLab 资源。 ps:授权回调 URL 必须与以下格式和路径匹配&…

检测敏感词功能

今天策划给我一个任务 —— 检测昵称中是否含有敏感词功能&#xff0c;然后丢给我两个压缩包&#xff0c;我解压一看&#xff1a; 有的txt文件是一行一个词&#xff1a; 有的txt文件是按逗号分隔开&#xff1a; 不管是什么格式的总之量非常多&#xff0c;把我这辈子脏话都囊括…

【OpenGL】OpenGL简介

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

python-24-一篇文章彻底掌握Python HTTP库Requests

python-24-一篇文章彻底掌握Python HTTP库Requests 一.简介 在 Python 中&#xff0c;Requests 是一个非常流行且易于使用的 Python HTTP 库&#xff0c;专门用于发送 HTTP/HTTPS 请求&#xff0c;获取请求响应&#xff1b; 可能觉得HTTP请求不是应该前端去做么&#xff1f;…

SpringMVC案例学习(一)--计算器设计登录页面设计

文章目录 1.计算器1.1.html代码1.2接口设计1.3前端测试1.4接口测试 2.登录页面设计2.1接口实现2.2查看前端页面效果2.3未进行前后端交互时候的代码2.4前后端交互设计2.5个人实践遇到的问题 3.lombok介绍3.1插件安装3.2导入依赖 1.计算器 1.1.html代码 下面的这个就是我们的前…

【Linux 麒麟系统 qt 程序通过root启动 桌面程序】

通过.desktop pkexec 启动程序 关键字方案一方案二第一步 修改.desktop第二步 xxx.sh实现 注意 关键字 pkexec .desktop qt 原始需求&#xff1a; 用户在麒麟系统上通过快捷方式(.desktop)启动程序后绑定系统的26端口&#xff0c;但是因为系统权限问题&#xff0c;26端口普通…

DevOps-Gitlab-私有代码仓库

1. 概述 1. 私有代码仓库 2. 精细化权限配置,让系统更安全 3. 控制用户/用户组是否可以提交到主分支 (PR Push Request) 4. 它使用Ruby语言写成。后来&#xff0c;一些部分用Go语言重写 2. Gitlab vs Github/Gitee GitlabGithub/Gitee共同点存放代码,git访问存放代码,git访问…

【AI声音克隆整合包及教程】第二代GPT-SoVITS V2:技术、应用与伦理思考

一、引言 在当今科技迅速发展的时代&#xff0c;声音克隆技术成为人工智能领域的一个备受瞩目的分支。GPT-SoVITS V2作为一种声音克隆工具&#xff0c;正逐渐进入人们的视野&#xff0c;它在多个领域展现出巨大的潜力&#xff0c;同时也引发了一系列值得深入探讨的问题。本文旨…

重新认识HTTPS

一. 什么是 HTTPS HTTP 由于是明文传输&#xff0c;所谓的明文&#xff0c;就是说客户端与服务端通信的信息都是肉眼可见的&#xff0c;随意使用一个抓包工具都可以截获通信的内容。 所以安全上存在以下三个风险&#xff1a; 窃听风险&#xff0c;比如通信链路上可以获取通信…

Vite初始化Vue3+Typescrpt项目

初始化项目 安装 Vite 首先&#xff0c;确保你的 Node.js 版本 > 12.0.0。然后在命令行中运行以下命令来创建一个 Vite Vue 3 TypeScript 的项目模板&#xff1a; npm init vitelatest进入项目目录 创建完成后&#xff0c;进入项目目录&#xff1a; cd vue3-demo启动…

Three.js 搭建3D隧道监测

Three.js 搭建3D隧道监测 Three.js 基础元素场景scene相机carema网络模型Mesh光源light渲染器renderer控制器controls 实现3d隧道监测基础实现道路实现隧道实现多个摄像头点击模型进行属性操作实现点击模型发光效果 性能监视器stats引入使用 总结完整代码 我们将通过three.js技…

【学术会议介绍,SPIE 出版】第四届计算机图形学、人工智能与数据处理国际学术会议 (ICCAID 2024,12月13-15日)

第四届计算机图形学、人工智能与数据处理国际学术会议 2024 4th International Conference on Computer Graphics, Artificial Intelligence and Data Processing (ICCAID 2024) 重要信息 大会官网&#xff1a;www.iccaid.net 大会时间&#xff1a;2024年12月13-15日 大会地…

VScode C++配置opencv4.5.3——先赞后看,配置成功实属不易-(镜像加速环境w版和配置文件版)

前置准备&#xff1a;配置MinGW和CMake 手把手教——class1_VScode配置C环境_linux vscode cpp配置-CSDN博客文章浏览阅读398次&#xff0c;点赞4次&#xff0c;收藏6次。点击Windows x64 Installer:下载msi文件 安装完成后验证。配置gcc文件下bin环境。最后ctrlF5运行尝试。W…

机器学习 笔记

特征值提取 字典 from sklearn.extaction import DictVectorizer mDictVectorizer(sparseFalse)#sparse是否转换成三元组形式 data[], #传入字典数据 data1model.fit_transform(data) #使用API 英文特征值提取 from sklearn.feature_extraction.text import CountVe…

推荐一款好用的postman替代工具2024

Apifox 是国内团队自主研发的 API 文档、API 调试、API Mock、API 自动化测试一体化协作平台&#xff0c;是非常好的一款 postman 替代工具。 它通过一套系统、一份数据&#xff0c;解决多个系统之间的数据同步问题。只要定义好接口文档&#xff0c;接口调试、数据 Mock、接口…