C++ 标准库 string 功能 用法运用 详解

news/2025/3/9 20:03:18/文章来源:https://www.cnblogs.com/baisemoshui/p/18761270

C++标准库中的<string>头文件提供了std::string类,用于处理字符串。std::string是对C风格字符串的封装,提供了更安全、更易用的字符串操作功能。以下是<string>的功能、用法及详细解析:

一、功能概述

<string>头文件中的std::string类提供了丰富的成员函数和操作符,用于字符串的连接、比较、查找、替换、插入、删除等操作。此外,std::string还自动管理其内部的字符数组,包括内存的分配和释放,使得开发者无需手动管理字符串的内存。

二、用法与详解

1. 声明与初始化

要使用std::string,首先需要包含<string>头文件。然后,可以声明std::string类型的变量,并通过多种方式初始化它。

#include <string>std::string s1; // 默认初始化,一个空字符串
std::string s2("hello"); // 直接初始化,s2是字符串字面值"hello"的副本
std::string s3 = s2; // 拷贝初始化,s3是s2的副本
std::string s4(5, 'c'); // 通过指定字符和重复次数来初始化,s4是由5个字符'c'组成的字符串

2. 连接操作

可以使用+操作符或+=操作符来连接字符串。

std::string s1 = "hello, ";
std::string s2 = "world!";
std::string s3 = s1 + s2; // s3是"hello, world!"
s1 += s2; // s1变为"hello, world!"

3. 比较操作

可以使用==!=<<=>>=等操作符来比较字符串。

if (s1 == "hello, world!") {// s1与"hello, world!"相等时执行的代码
}

4. 查找操作

可以使用find成员函数来查找子字符串在主字符串中的位置。

std::string s = "abcdefg";
std::string subs = "efg";
int pos = s.find(subs); // 如果找到子字符串则返回首次匹配的位置,否则返回std::string::npos

5. 替换操作

可以使用replace成员函数来替换字符串中的某些字符。

std::string modified = s;
std::string::size_type pos = modified.find("efg");
if (pos != std::string::npos) {modified.replace(pos, 3, "XYZ"); // 从位置pos开始,替换3个字符为"XYZ"
}

6. 插入操作

可以使用insert成员函数在字符串的指定位置插入字符或子字符串。

std::string s = "abc";
s.insert(1, 2, 'D'); // 在位置1插入2个字符'D',s变为"aDDbc"

7. 删除操作

可以使用erase成员函数删除字符串中的字符。

std::string str = "This is an example phrase.";
str.erase(10, 8); // 删除从位置10开始的8个字符,str变为"This is an phrase."

8. 访问字符

可以使用operator[]at成员函数来访问字符串中的字符。注意,at有越界检查,而operator[]没有。

std::string s = "abcd";
char c1 = s[0]; // 访问位置0的字符,c1为'a'
char c2 = s.at(2); // 访问位置2的字符,c2为'c'

9. 获取字符串长度

可以使用sizelength成员函数来获取字符串的长度。

std::string s = "Hello, world!";
int len = s.size(); // 或s.length(),返回13

10. 子字符串提取

可以使用substr成员函数来提取子字符串。

std::string s = "Hello World";
std::string sub = s.substr(3, 5); // 从位置3开始提取5个字符,sub为"lo Wo"

三、注意事项

  1. 字符串字面值与std::string对象相加:字符串字面值不能直接相加,但可以与std::string对象相加。例如,"hello" + "world"是错误的,但"hello" + std::string("world")或std::string("hello") + "world"是正确的。
  2. 输入输出:使用cincout进行std::string对象的输入输出时,cin会自动忽略开头的空白字符(如空格、换行符、制表符),直到遇到第一个非空白字符开始读取,直到再次遇到空白字符为止。而cout则会输出std::string对象的全部内容。
  3. 内存管理:std::string类型会自动管理其内部的字符数组,包括内存的分配和释放。因此,开发者无需手动管理std::string对象的内存。

综上所述,<string>头文件提供了强大的字符串处理功能,通过std::string类,开发者可以方便地进行字符串的各种操作。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UE5之使用C++显示瞄准准星

1.创建控件蓝图 首先右键 用户界面---控件蓝图,创建一个控件蓝图CrosshairWidget,默认继承自UserWidget。在CrosshairWidget中新建一个Canvas Panel,再创建一个Image,加入准星图像并设置位置居中,这样准星的UI就完成了。 再添加一个图像,将其绘制为圆形盒体,这样就得到了…

20242802 2024-2025-2 《网络攻防实践》第二周作业

20242802 2024-2025-2 《网络攻防实践》第二周作业 目录 目录20242802 2024-2025-2 《网络攻防实践》第二周作业1. 实验要求2. 实验相关知识点nmap工具使用3. 实验详细过程3.1 从www.besti.edu.cn、baidu.com、sina.com.cn中选择一个DNS域名进行查询,获取如下信息:3.2尝试获取…

UE5之瞄准视角的俯仰偏移

1.创建瞄准姿势 复制瞄准动画,删除其中多余的帧,只保留瞄准的一帧,将其创建为一个单帧动画。然后将其复制成三份,分别用于表示瞄准三个姿势的up,middle,down。 将middle姿势动画的Additive动画类型修改为网格体空间,因为我们需要在网格空间创建叠加动画。基础姿势修改为…

2K star!三分钟搭建企业级后台系统,这款开源Java框架绝了!

"LikeAdmin Java是基于Spring Boot + Mybatis Plus + Vue 3的快速开发平台,内置RBAC权限管理、工作流引擎、数据可视化、三方登录等核心模块,助力开发者快速构建企业级中后台管理系统"2K star!三分钟搭建企业级后台系统,这款开源Java框架绝了!"LikeAdmin J…

震惊!C++程序真的从main开始吗?99%的程序员都答错了

嘿,朋友们好啊!我是小康。今天咱们来聊一个看似简单,但实际上99%的C++程序员都答错的问题:C++程序真的是从main函数开始执行的吗? 如果你毫不犹豫地回答"是",那恭喜你,你和大多数人一样——掉进了C++的第一个陷阱!别担心,等你看完这篇文章,你就能成为那个与…

11套!量产15W~1000W开关电源电路全套方案资料合集!

本系列小编给大家带来了15W到1000W完整量产版开关电源全系列,全套资料分期给大家分享。每套资料都包含详细的原理图,PCB图,变压器图纸,共模电感图纸,磁环图纸!点击下方链接获取! 15W开关电源方案👆👆👆(点击下载) 25W开关电源方案👆👆👆(点击下载) 30W开…

【每日一题】20250309

我所渴望的,不过是过上一种发自本心的生活,为什么竟会如此困难?【每日一题】已知 \(\odot C\) 过点 \(P(1,2)\),与 \(y\) 轴相交于点 \(Q(0,6)\).若过点 \(Q\) 作 \(\odot C\) 的切线 \(l\),其切线 \(l\) 与 \(x\) 轴平行,则 \(l\) 的方程为_________,\(\odot C\) 的标…

FastAPI Cookie 和 Header 参数完全指南:从基础到高级实战

title: FastAPI Cookie 和 Header 参数完全指南:从基础到高级实战 🚀 date: 2025/3/9 updated: 2025/3/9 author: cmdragon excerpt: 本教程深入探讨 FastAPI 中 Cookie 和 Header 参数的读取与设置,涵盖从基础操作到高级用法。通过详细的代码示例、课后测验和常见错误解…

vim按f5运行代码配置

使vim能够像vscode一样按f5运行代码 效果图let g:last_terminal_buf = -1 " 用于存储上一个终端缓冲区编号 function! RunCurrentFile() " 如果存在上次的终端缓冲区,则删除它 if g:last_terminal_buf != -1 && bufexists(g:last_terminal_buf) silent exec…

DeepSeek + Xmind,1分钟自动把pdf/word文档转成思维导图

DeepSeek加Xmind,1分钟把PDF、Word文档转成思维导图!步骤超简单:第一步:打开DeepSeek,点击“深度思考”,上传你的文档。第二步:告诉DeepSeek“帮我转成思维导图,输出Markdown格式”。第三步:复制代码, 保存文件到桌面文本文件中,修改文件后缀为“.md”。第四步:打开…

Windows平台调试器原理与编写05.内存断点

https://www.bpsend.net/thread-274-1-3.html 内存断点访问断点 写入断点内存写入断点简介:当被调试进程访问,读或写指定内存的时候,程序能够断下来。 思考1:要想将一段内存设为内存断点,最终的目的是让其能够抛异常。调试器是基于异常的一个程序。应该如何实现呢?可以通…

Redis--Lesson01--NoSQL简史

单击MySQL的演进 单机MySQL 在早期互联网时代,也就是90年代以前,一个基本的互联网的访问量不会太大,可以说很多国家和地区都还没有配备互联网,所以在这种情况下的互联网格局使用的数据存储格式就是简单的单机模式,即使用一个数据库的如MySQL库就可以满足日常的数据读写 如…