C++ String知识点

当然可以!下面我将以系统全面、通俗易懂、深入浅出的方式,为你讲解 C++ 中非常核心但也容易被低估的内容 —— std::string


🌟 C++ std::string 全面详解

📌 一、string 是什么?

C++ 的 std::string 是 C++ 标准库中封装好的字符串类,本质是一个用于处理文本数据的容器。它定义在头文件:

#include <string>

✅ 与 C 语言字符串的区别

特点C 字符串 (char[])C++ 字符串 (std::string)
存储方式字符数组 + 结束符 \0类对象,有长度信息
可否动态扩展❌ 不能自动扩展✅ 自动扩展,支持追加
操作接口函数库函数(如 strcpy成员函数(如 .append()
安全性易越界、不安全较安全,支持边界检查

📌 二、string 的常见构造方式

std::string s1;                   // 空字符串
std::string s2 = "hello";         // 从字符串字面值构造
std::string s3("world");          // 同上,直接构造
std::string s4(5, 'a');           // "aaaaa"
std::string s5 = s2 + s3;         // 拼接字符串 "helloworld"

📌 三、常用操作方法与功能详解

🧩 1. 访问字符串内容

std::string str = "hello";
char c1 = str[1];        // 'e'
char c2 = str.at(1);     // 更安全,带边界检查

🧩 2. 修改字符串内容

str[0] = 'H';           // "Hello"
str.push_back('!');     // "Hello!"
str.pop_back();         // "Hello"

🧩 3. 添加和连接字符串

std::string s = "Hi";
s += " there";          // "Hi there"
s.append("!!!");        // "Hi there!!!"

🧩 4. 字符串长度

s.size();    // 字符个数(等同于 s.length())
s.empty();   // 是否为空

🧩 5. 查找与替换

std::string s = "I love C++";
size_t pos = s.find("love");   // 2
s.replace(pos, 4, "like");     // "I like C++"
  • find(str):返回首次出现位置
  • rfind(str):返回最后一次出现的位置
  • find_first_of(characters):任意字符第一次出现
  • replace(pos, len, new_str):替换一部分内容

🧩 6. 子串操作

std::string s = "abcdef";
std::string sub = s.substr(2, 3);  // "cde"

🧩 7. 清空和比较

s.clear();         // 清空字符串
s1 == s2           // 比较内容是否相等(重载了 ==)
s1.compare(s2);    // 返回负数/0/正数

📌 四、string 的迭代器支持(像容器一样)

for (char c : s) {std::cout << c;
}

也支持:

std::string::iterator it = s.begin();
while (it != s.end()) {std::cout << *it;++it;
}

📌 五、与 C 风格字符串互转

🔁 string → C 字符串

const char* cstr = s.c_str();   // 返回 const char*

🔁 C 字符串 → string

char buf[] = "abc";
std::string s(buf);

📌 六、常见陷阱⚠️

  1. 别忘记包含头文件

    #include <string>
    
  2. c_str() 返回的是 const char*,不能修改!

  3. at() 有越界检查,[] 没有。

  4. substr(pos, len) 若超出范围不会抛异常,而是只截取可用部分。


📌 七、小案例:单词统计器

#include <iostream>
#include <string>int main() {std::string input;std::cout << "请输入一句话:";std::getline(std::cin, input);int word_count = 0;bool in_word = false;for (char c : input) {if (!isspace(c)) {if (!in_word) {word_count++;in_word = true;}} else {in_word = false;}}std::cout << "单词数:" << word_count << std::endl;return 0;
}

📌 八、string 底层原理简述(进阶)

  • 实际上 std::string 是一个类,内部有一个动态分配的字符数组。
  • C++11 起,大多数实现采用 Small String Optimization(SSO) —— 小字符串会直接存在对象内部,不会动态分配。
  • 动态增长时,std::string 会申请更大的内存空间并拷贝内容,策略类似于 vector

✅ 九、string 相关常用函数速查表

操作函数名示例
长度.size()s.size()
添加字符.push_back(c)s.push_back('!')
添加字符串.append(str)s.append("abc")
查找子串.find(str)s.find("abc")
替换子串.replace(p, l, r)s.replace(2, 3, "hi")
截取子串.substr(p, l)s.substr(0, 3)
清空.clear()s.clear()
比较字符串.compare(str)s.compare("abc")
转C字符串.c_str()printf("%s", s.c_str())
插入子串.insert(pos, s)s.insert(2, "xx")
删除部分.erase(pos, len)s.erase(0, 2)

📚 十、推荐用法技巧

  • 使用 std::getline() 获取带空格的整行输入。
  • 使用 + 运算符快速拼接多个字符串。
  • 当性能关键时,尽量避免频繁拼接小字符串(会频繁分配内存)。

如果你感兴趣,我还可以讲:

  • std::string_view 的轻量引用方式
  • 多语言支持(Unicode处理)
  • ostringstream 结合 string 输出字符串
  • std::format(C++20)处理格式化字符串

需要我继续扩展哪一部分吗?比如底层实现、性能优化、string_view、高级技巧、源码分析等,我都可以展开讲。

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

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

相关文章

全新NVIDIA Llama Nemotron Nano视觉语言模型在OCR基准测试中准确率夺冠

全新NVIDIA Llama Nemotron Nano视觉语言模型在OCR基准测试中准确率夺冠 PDF、图表、图形和仪表板等文档是丰富的数据源&#xff0c;当这些数据被提取和整理后&#xff0c;能够为决策制定提供有价值的洞察。从自动化财务报表处理到改进商业智能工作流程&#xff0c;智能文档处…

gradle的 build时kaptDebugKotlin 处理数据库模块

gradle的 build时输出&#xff1a; Task :app:kaptDebugKotlin 注: Processing class HDCoinBean 注: Processing class HDCurrencyBean 注: Processing class HDSelfAddCoin 注: Processing class MN 注: Creating DefaultRealmModule <—> 80% EXECUTING [7m 56s] IDLE…

二叉树的节点操作算法

235. 二叉搜索树的最近公共祖先 力扣题目链接(opens new window) 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大…

【ubuntu驱动安装】安装nvidia驱动和cuda环境

1、安装驱动 首先查看环境和显卡&#xff1a; 更新apt 查看nouveau是否禁用 如果有返回值禁用nouveau(nouveau是通用的驱动程序)&#xff08;必须&#xff09;&#xff0c;两种文件&#xff0c;22.04是下面那个 添加如下&#xff1a; 终端输入后更新 重启电脑sudo reboo…

力扣HOT100之终章:一些随笔

今天终于把力扣HOT100系列给刷完了&#xff0c;每一道题都记录了自己的思考过程和解题过程中参考的一些题解和视频&#xff0c;方便自己以后再刷的时候快速复习&#xff0c;从2025年3月4日写下第一篇博客&#xff0c;到2025年6月12日完成最后一题并写下最后一篇博客&#xff0c…

榕壹云家政系统:基于Spring Boot与UniApp的智能家政服务解决方案

在数字化浪潮下&#xff0c;传统家政行业正面临效率与服务质量的升级挑战。榕壹云公司依托前沿技术&#xff0c;推出了一款用户端与师傅端二合一的家政服务小程序&#xff0c;通过整合预约上门、分销、储值、优惠券等功能&#xff0c;为家政服务行业提供了一套高效、灵活的数字…

CSRF扩展 JSONP劫持

介绍&#xff1a;JOSNP&#xff08;JSONP with Override Security Negotiation Protocol&#xff09;劫持是一种利用JSONP &#xff08;JSON with Padding&#xff09;跨域数据获取机制的安全漏洞&#xff0c;攻击者通过篡改或伪造JSONP回调函数窃 取用户敏感数据。由于JSONP…

HTTP/HTTPS 协议解析

前言 在当今互联网时代&#xff0c;HTTP/HTTPS 协议作为 Web 通信的基石&#xff0c;承载着几乎所有的网络内容传输。对于我们而言&#xff0c;深入理解这些协议不仅是技术素养的体现&#xff0c;更是构建高性能、安全、可靠 Web 应用的必要条件。 为什么我们需要深入了解 HT…

Flask-login 处理授权逻辑

认证 vs 授权&#xff1a; 在 Web 应用程序的安全机制中&#xff0c;认证&#xff08;Authentication&#xff09; 和 授权&#xff08;Authorization&#xff09; 是两个核心概念&#xff0c;它们虽然紧密相关&#xff0c;但职责和作用不同。 认证&#xff08;Authenticatio…

xenomai3+linux构建linux实时操作系统-基于X86_64和arm

简介&#xff1a; Xenomai是一个实时性解决方案&#xff0c;通过在Linux上添加实时内核Cobalt来增强实时性能。它有三个主要部分&#xff1a;libcobalt&#xff08;用户空间实时库&#xff09;、Cobalt&#xff08;内核空间实时内核&#xff09;和硬件架构特定层&#xff08;ip…

Linux核心文件(core file)详解

一、核心文件&#xff08;core file&#xff09;概述 1.1 什么是核心文件 核心文件&#xff08;core file&#xff09;是Linux操作系统在程序崩溃时生成的一种转储文件。它包含了程序崩溃时的内存内容、寄存器状态和执行状态。通过分析核心文件&#xff0c;开发者可以找到程序…

java中跨域问题及解决方案

1. 什么是跨域 从不同的地址访问另外一个地址就是跨域 2.跨域一定会有异常吗 跨域异常只会在前端发生&#xff0c;后端跨域不会产生异常 因为浏览器有一个叫做同源策略的东西&#xff0c;它发现不同域之间的访问是不安全的行为&#xff0c;会禁止&#xff0c;所以会抛出异常…

网络层协议 IP 协议介绍 -- IP 协议,网段划分,私有 IP 和 公网 IP,路由

目录 1 IP 协议 1.1 IP 协议格式 2. 网段划分 2.1 网络号和主机号 2.2 传统 IP 地址分类和 CIDR 技术 2.3 特殊的 IP 地址 2.4 IP 地址的数量限制 2.5 私有 IP 和公网 IP 3. 路由 网络层主要作用是实现不同局域网之间的通信连接&#xff0c;并为数据在复杂网络环境中的…

【案例分享】KMDA-7611-S001--高性能嵌入式电脑助力双臂轮式人形机器人应用

智能制造时代&#xff0c;双臂轮式机器人需求浮出水面 随着制造业、物流业和电子商务的飞速发展&#xff0c;智能搬运机器人正成为行业降本增效的核心工具。它们不仅解决了传统物流中效率低、成本高、安全性差等痛点&#xff0c;更通过智能化与可扩展性设计&#xff0c;通过自主…

iOS App上线前的安全防线:项目后期如何用Ipa Guard与其他工具完成高效混淆部署

对大多数iOS开发者来说&#xff0c;安全并不是开发早期就能解决的问题。尤其在项目逐步进入上线准备阶段后&#xff0c;才开始集中考虑逆向破解、资源泄露等安全隐患的解决方案。这个阶段往往时间紧张、结构复杂&#xff0c;再要重构源码或引入大规模修改几乎不现实。因此&…

技术佃农时代:当云计算成为新型地主经济

技术佃农时代:当云计算成为新型地主经济 导语:当算力成为生产资料,云账单背后的「数字佃租」正悄然重塑IT生产关系——我们是否在用自己的代码为云厂商开垦数字荒地? 一、揭开云计算的「佃租算法」面纱 // 云经济体的核心收割逻辑 public class CloudLandlord {public sta…

23种设计模式图解

《设计模式&#xff1a;可复用面向对象软件的基础》是软件工程领域的经典著作&#xff0c;由四位顶尖专家&#xff08;Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides&#xff0c;合称GoF&#xff09;编写&#xff0c;首次系统化提出了23种设计模式&#xff0c;分为…

git新建一个分支到gitlab项目目录中

先向git确认身份 git config --global user.email "youexample.com"看一下当前在哪个分支上&#xff08;没啥影响&#xff09; git status lculation$ git status 位于分支 my_new_branch 您的分支与上游分支 origin/main 一致。 用origin/main分支来新建一个分支 …

云原生时代配置中心全景解读:从Spring Cloud Config到Nacos深度实践

摘要&#xff1a;在分布式系统和云原生架构中&#xff0c;配置管理已从简单的键值存储演进为核心基础设施组件。本文深入解析四大主流配置中心&#xff08;Spring Cloud Config、Apollo、Nacos、Consul&#xff09;的架构设计与实战应用&#xff0c;并分享生产环境下的最佳实践…

Vue3 defineModel 原理解析

1. 引言 在上一篇文章中探讨了v-model的实现原理&#x1f517;。本文将聚焦于Vue3.4版本新增的defineModel语法糖&#xff0c;它显著简化了组件中v-model的实现方式。我们将详细解析defineModel的工作原理&#xff0c;并与3.4版本之前实现组件v-model的方法进行对比。 2. Vue…