C++中string常用方法操作指南(后续补充)

文章目录

    • 1. 定义和初始化字符串
    • 2. 字符串的基本操作
      • 2.1 获取字符串长度
      • 2.2 检查字符串是否为空
      • 2.3 访问字符串中的字符
    • 3. 输入字符串
    • 4. 常用的字符串操作
      • 4.1 截取子字符串
      • 4.2 查找子字符串
      • 4.3 替换字符串
      • 4.4 插入字符串
      • 4.5 删除字符串
    • 5. 字符串的排序
    • 6. 字符串与数值的转换
      • 6.1 字符串转数值
      • 6.2 数值转字符串
    • 7. C++新特性补充
      • 7.1 使用string_view(C++17)
      • 7.2 格式化字符串(C++20)

在C++中,字符串是由一系列字符组成的序列:

  1. C风格:使用字符数组表示,以\0结尾。
  2. C++字符串类:使用std::string类,更强更方便。

这里主要介绍std::string的使用。


1. 定义和初始化字符串

#include <iostream>
#include <string>  // 必须包含这个头文件

int main() {
    // 1. 定义一个空字符串
    std::string s1;

    // 2. 直接初始化
    std::string s2 = "Hello";  // 使用等号初始化
    std::string s3("World");   // 使用括号初始化

    // 3. 重复字符初始化
    std::string s4(5, 'A');    // 结果是 "AAAAA"

    // 4. 从另一个字符串的子串初始化
    std::string s5(s2, 1, 3);  // 从s2的第1个字符开始,取3个字符,结果是 "ell"

    std::cout << s2 << " " << s3 << std::endl;  // 输出: Hello World
    return 0;
}

2. 字符串的基本操作

2.1 获取字符串长度

size_t length() const noexcept;
size_t size() const noexcept;
  • 参数:无
  • 返回值:返回字符串的长度(以字符数为单位)。
std::string s = "Hello";
int len1 = s.length();  // 结果是 5
int len2 = s.size();    // 结果也是 5

2.2 检查字符串是否为空

bool empty() const noexcept;
  • 参数:无
  • 返回值:如果字符串为空,返回true;否则返回false
if (s.empty()) {
    std::cout << "空" << std::endl;
} else {
    std::cout << "非空" << std::endl;
}

2.3 访问字符串中的字符

char& operator[](size_t pos);
char at(size_t pos) const;
  • 参数pos:要访问的字符位置(从0开始)。

  • 返回值operator[]:返回指定位置的字符引用。at:返回指定位置的字符,支持边界检查,越界会抛出std::out_of_range异常。

char firstChar = s[0];  // 获取第一个字符,结果是 'H'
char secondChar = s.at(1);  // 获取第二个字符,结果是 'e'

3. 输入字符串

#include <iostream>
#include <string>

int main() {
    // 1. 使用cin(遇到空格或换行结束)
    std::string s1;
    std::cin >> s1;  // 输入 "Hello World",s1只会得到 "Hello"

    // 2. 使用getline读取整行
    std::string s2;
    std::getline(std::cin, s2);  // 输入 "Hello World",s2会得到完整的 "Hello World"

    // 3. 使用字符数组(C风格)
    char buf[100];
    std::cin.getline(buf, sizeof(buf));  // 读取一行到字符数组中

    std::cout << s1 << std::endl;
    std::cout << s2 << std::endl;
    return 0;
}

4. 常用的字符串操作

4.1 截取子字符串

std::string substr(size_t pos = 0, size_t len = npos) const;
  • 参数pos:子字符串的起始位置。 len:子字符串的长度,默认为直到字符串末尾。
  • 返回值:返回一个新的字符串,表示截取的子字符串。
std::string s = "Hello World";
std::string sub = s.substr(6, 5);  
// 从第6个字符开始,截取5个字符,结果是 "World"

4.2 查找子字符串

size_t find(const std::string& str, size_t pos = 0) const noexcept;
  • 参数str:要查找的子字符串。pos:从哪个位置开始查找,默认为0。
  • 返回值:如果找到,返回子字符串的起始位置;否则返回std::string::npos
size_t pos = s.find("World");  // 查找 "World" 的位置,结果是 6
if (pos != std::string::npos) {
    std::cout << "找到了!位置是:" << pos << std::endl;
} else {
    std::cout << "没找到!" << std::endl;
}

4.3 替换字符串

std::string& replace(size_t pos, size_t len, const std::string& str);
  • 参数pos:替换起始位置。 len:替换的字符长度。 str:用于替换的新字符串。
  • 返回值:返回修改后的字符串引用。
s.replace(6, 5, "abcdefgh");  // 从第6个字符开始,替换5个字符为 "abcdefgh"
std::cout << s << std::endl;  // 输出: Hello abcdefgh

4.4 插入字符串

std::string& insert(size_t pos, const std::string& str);
  • 参数pos:插入位置。str:要插入的字符串。
  • 返回值:返回修改后的字符串引用。
s.insert(5, " Beautiful");  // 在第5个字符后插入 " Beautiful"
std::cout << s << std::endl;  // 输出: Hello Beautiful Universe

4.5 删除字符串

std::string& erase(size_t pos = 0, size_t len = npos);
  • 参数pos:删除起始位置。len:删除的字符长度,默认为直到字符串末尾。
  • 返回值:返回修改后的字符串引用。
s.erase(5, 10);  // 从第5个字符开始,删除10个字符
std::cout << s << std::endl;  // 输出: Hello Universe

5. 字符串的排序

template< class RandomIt >
void sort( RandomIt first, RandomIt last );
  • 参数first:排序范围的起始迭代器。last:排序范围的结束迭代器。
  • 返回值:无。
#include <algorithm>  

std::string s = "hello";
std::sort(s.begin(), s.end());  
std::cout << s << std::endl;  // 输出: ehllo

6. 字符串与数值的转换

6.1 字符串转数值

int stoi(const std::string& str, size_t* idx = nullptr, int base = 10);
double stod(const std::string& str, size_t* idx = nullptr);
  • 参数
    • str:要转换的字符串。
    • idx:可选参数,指向转换结束的位置。
    • base:进制,默认为10。
  • 返回值:返回转换后的数值。
std::string numStr = "123";
int num = std::stoi(numStr);  // 字符串转整数
double d = std::stod("3.14"); // 字符串转浮点数

6.2 数值转字符串

std::string to_string(int val);
std::string to_string(double val);
  • 参数val:要转换的数值。
  • 返回值:返回转换后的字符串。
int num = 42;
std::string str = std::to_string(num);  // 整数转字符串
std::cout << str << std::endl;  // 输出: 42

7. C++新特性补充

7.1 使用string_view(C++17)

class std::string_view {
public:
    std::string_view(const std::string& str);
    std::string_view(const char* str);
};
  • 参数str:字符串或字符数组。
  • 返回值:构造一个轻量级的字符串视图对象。
#include <string_view>

void print(std::string_view sv) {
    std::cout << sv << std::endl;
}

int main() {
    std::string s = "Hello World";
    print(s);  // 输出: Hello World
    print("C++ is fun");  // 输出: C++ is fun
    return 0;
}

7.2 格式化字符串(C++20)

template<class... Args>
std::string format(const std::string& fmt, const Args&... args);
  • 参数fmt:格式化字符串模板。args:格式化参数。
  • 返回值:返回格式化后的字符串。
#include <format>

std::string message = std::format("Hello, {}!", "World");
std::cout << message << std::endl;  // 输出: Hello, World!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

有序分数,递归stern-Brocot Tree

题目&#xff1a; 1360. 有序分数 题目 提交记录 讨论 题解 视频讲解 给定一个整数 NN&#xff0c;请你求出所有分母小于或等于 NN&#xff0c;大小在 [0,1][0,1] 范围内的最简分数&#xff0c;并按从小到大顺序依次输出。 例如&#xff0c;当 N5N5 时&#xff0c;所…

一批起飞猪名单配图

好久没有使用风口猪选股指标了&#xff0c;今天去玩了一把&#xff0c;发现起飞猪指标显示了好多一批猪票 华曙高科 汉威科技 双林股份 曼恩斯特 长盈精密 江苏雷利 双飞集团 奥飞数据 硅宝科技 水晶光电 长盈精密

跳表(Skip List)详解

一、什么是跳表&#xff1f; 跳表是一种基于有序链表的高效数据结构&#xff0c;通过建立多级索引实现快速查询。它在平均情况下支持O(log n)时间复杂度的搜索、插入和删除操作&#xff0c;性能接近平衡树&#xff0c;但实现更为简单。 二、核心原理 1. 层级结构 底层为完整…

Pycharm中查找与替换

1、Edit -> Find -> Find 在当前文件中查找 2、Edit -> Find -> Find in Files 在所有文件中查找 3、Edit -> Find -> Replace 在当前文件中执行替换 4、Edit -> Find -> Replace in Files 在所有文件中执行替换

Ollama本地部署大模型(Mac M1 )

本文主要记录第一次尝试使用本地部署开源大模型。 目录 环境准备 安装Ollama 安装open-webUI Docker方式安装open-webUI 第一步&#xff1a;安装docker 第二步&#xff1a;安装open-webUI Anaconda方式安装open-webUI 第一步&#xff1a;安装Anaconda 第二步&#x…

3分钟了解内外网文件传输:常见方法、注意事项有哪些?

内外网文件传输不仅是企业日常运营的基础设施&#xff0c;更是支持业务增长、创新和合规的关键工具。通过高效、安全的文件传输&#xff0c;企业能够更好地应对全球化协作、远程办公和数据安全等挑战&#xff0c;从而在竞争激烈的市场中保持领先地位。 一、内外网文件传输的常…

利用AFE+MCU构建电池管理系统(BMS)

前言 实际BMS项目中&#xff0c;可能会综合考虑成本、可拓展、通信交互等&#xff0c;用AFE&#xff08;模拟前端&#xff09;MCU&#xff08;微控制器&#xff09;实现BMS&#xff08;电池管理系统&#xff09;。 希望看到这篇博客的朋友能指出错误或提供改进建议。 有纰漏…

unity学习49:寻路网格链接 offMeshLinks, 以及传送门效果

目录 1 网格链接 offMeshLinks 功能入口 1.1 unity 2022之前 1.2 unity 2022之后 2 网格链接 offMeshLinks 功能设置 3 点击 offMeshLinks 功能里的bake 3.1 unity 2022之前 3.2 unity 2022之后 3.3 实测link 3.4 跳跃距离增大&#xff0c;可以实现轻功类的效果 4 …

HarmonyOS NEXT网络状态监听HTTP和RCP请求网络

当我们在HarmonyOS NEXT中开发的应用&#xff0c;基本上都会使用网络请求&#xff0c;从服务端获取数据在客户端显示或者供用户交互&#xff0c;有时候网络发生变化时&#xff0c;我们需要做一些相应的操作&#xff0c;接下来我们一起来了解下在HarmonyOS NEXT下如何监听网络状…

如何在 VS Code 中快速使用 Copilot 来辅助开发

在日常开发中&#xff0c;编写代码往往是最耗时的环节之一。而 GitHub Copilot&#xff0c;作为一款 AI 编码助手&#xff0c;可以帮助开发者 自动补全代码、生成代码片段&#xff0c;甚至直接编写完整的函数&#xff0c;大幅提升编码效率。那么&#xff0c;如何在 VS Code 中快…

【16届蓝桥杯寒假刷题营】第2期DAY1I

4.有向无环的路径数 - 蓝桥云课 问题描述 给定 N 个节点 M 条边的有向无环图&#xff0c;请你求解有多少条 1 到 N 的路径。 由于答案可能很大&#xff0c;你只需要输出答案对 998244353 取模后的结果。 输入格式 第一行包含 2 个正整数 N,M&#xff0c;表示有向无环图的节…

伯克利 CS61A 课堂笔记 10 —— Trees

本系列为加州伯克利大学著名 Python 基础课程 CS61A 的课堂笔记整理&#xff0c;全英文内容&#xff0c;文末附词汇解释。 目录 01 Trees 树 Ⅰ Tree Abstraction Ⅱ Implementing the Tree Abstraction 02 Tree Processing 建树过程 Ⅰ Fibonacci tree Ⅱ Tree Process…

Spring Boot 定时任务:轻松实现任务自动化

在现代应用开发中&#xff0c;定时任务是一个常见的需求。比如&#xff0c;我们可能需要定时清理过期数据、定时发送邮件通知等。 操作流程 开启定时任务注解 在启动类添加注解EnableScheduling 设置时间&#xff08;固定时间间隔&#xff09; 使用 Scheduled 注解创建定时…

通过监督微调提升多语言大语言模型性能

引言 澳鹏助力一家全球科技公司提升其大语言模型&#xff08;LLM&#xff09;的性能。通过提供结构化的人工反馈形式的大语言模型训练数据&#xff0c;让该模型在30多种语言、70多种方言中的表现得到优化。众包人员们进行多轮对话&#xff0c;并依据回复的相关性、连贯性、准确…

Flask实现高效日志记录模块

目录 一. 简介&#xff1a; 1. 为什么需要请求日志 二. 日志模块组成 1. 对应日志表创建&#xff08;包含日志记录的关键字段&#xff09; 2. 编写日志记录静态方法 3. 在Flask中捕获请求日志 4. 捕获异常并记录错误日志 5. 编写日志接口数据展示 6. 写入数据展…

【学习笔记】Cadence电子设计全流程(一)Cadence 生态及相关概念

【学习笔记】Cadence电子设计全流程&#xff08;一&#xff09;Cadence 生态及相关概念 1.1 Cadence 生态系统及各模块关系1.2 Cadence相较于Altium Designer在硬件设计中的优势 1.1 Cadence 生态系统及各模块关系 Cadence 提供了一套完整的电子设计自动化 (EDA) 工具链&#…

【Linux Redis】关于用docker拉取Redis后,让虚拟机运行起来redis,并使得其可以连接到虚拟机外的navicat。

步骤一&#xff1a;拉取Redis镜像 docker pull redis 这个命令会下载最新版本的Redis镜像到你的本地Docker仓库中。你也可以指定一个具体的版本号&#xff0c;例如docker pull redis:6.2.6&#xff0c;来拉取特定版本的Redis镜像。 如果拉取遇到问题请参考【Linux AnolisOS】关…

蓝桥与力扣刷题(蓝桥 裁纸刀)

本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 题目&#xff1a;小蓝有一个裁纸刀&#xff0c;每次可以将一张纸沿一条直线裁成两半。 小蓝用一张纸打印出两行三列共 6 个二维码&#xff0c;至少使用九次裁出来&#xff0c…

pdf转换成word在线 简单好用 支持批量转换 效率高 100%还原

pdf转换成word在线 简单好用 支持批量转换 效率高 100%还原 在数字化办公的浪潮中&#xff0c;文档格式转换常常让人头疼不已&#xff0c;尤其是 PDF 转 Word 的需求极为常见。PDF 格式虽然方便阅读和传输&#xff0c;但难以编辑&#xff0c;而 Word 格式却能灵活地进行内容修…

Django ModelForm使用(初学)

1.目的是根据员工表字段&#xff0c;实现一个新增员工的数据填写页面 2.在views.py文件中按下面的格式写 定义 ModelForm 类&#xff1a;UserModelForm &#xff08;自己命名的类名&#xff09;使用时需要导入包 定义视图函数&#xff1a;user_model_form_add&#xff08;在函…