c++中如何查找字符串中是否包含子串_c++字符串查找方法详解

C++中判断字符串包含子串常用find函数,如str.find(substr) != std::string::npos表示找到;可转换为小写实现忽略大小写查找;也可用std::search配合自定义比较函数;复杂场景可用正则表达式regex_search。

c++中如何查找字符串中是否包含子串_c++字符串查找方法详解

在C++中判断一个字符串是否包含某个子串,有多种方法可以实现。最常用的是利用标准库 std::string 提供的成员函数 find,也可以结合其他方式如 std::search 或第三方库(如正则表达式)来完成。下面详细介绍几种实用且高效的查找方法。

使用 find 函数查找子串

std::string::find 是最直接、最常用的方法。它会在主串中搜索指定的子串,如果找到,返回子串首次出现的位置;未找到则返回 std::string::npos

示例代码:

#include #include 

int main() {std::string str = "Hello, this is a sample string.";std::string substr = "sample";

if (str.find(substr) != std::string::npos) {    std::cout << "找到了子串!" << std::endl;} else {    std::cout << "未找到子串。" << std::endl;}return 0;

}

说明:只要 find 返回值不是 std::string::npos,就表示包含该子串。

立即学习“C++免费学习笔记(深入)”;

不区分大小写的子串查找

C++ 标准库没有提供直接的忽略大小写查找方法,需要手动转换或逐字符比较。

一种简单实现是先将主串和子串都转为小写,再用 find 比较:

#include #include #include #include 

std::string toLower(const std::string& s) {std::string result = s;std::transform(result.begin(), result.end(), result.begin(),[](unsigned char c){ return std::tolower(c); });return result;}

int main() {std::string str = "Hello, THIS is awesome!";std::string substr = "this";

if (toLower(str).find(toLower(substr)) != std::string::npos) {    std::cout << "找到了(忽略大小写)!" << std::endl;}return 0;

}

这种方法适用于对性能要求不高的场景。

使用标准算法 search 进行自定义匹配

std::search 中的通用搜索函数,可用于在字符序列中查找子序列,支持自定义比较函数。

例如,实现忽略大小写的查找:

#include #include #include #include 

bool caseInsensitiveCharCompare(char a, char b) {return std::tolower(a) == std::tolower(b);}

int main() {std::string str = "C++ is powerful";std::string substr = "POWERFUL";

auto it = std::search(str.begin(), str.end(),                      substr.begin(), substr.end(),                      caseInsensitiveCharCompare);if (it != str.end()) {    std::cout << "找到了,位置:" << (it - str.begin()) << std::endl;} else {    std::cout << "未找到。" << std::endl;}return 0;

}

这种方式更灵活,适合复杂匹配逻辑。

使用正则表达式进行模式匹配

对于更复杂的子串匹配需求(比如模糊匹配、通配符等),可以使用 库。

#include #include #include 

int main() {std::string text = "Contact us at support@example.com today.";std::regex pattern(R"(b[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,}b)");

if (std::regex_search(text, pattern)) {    std::cout << "发现了邮箱地址!" << std::endl;}return 0;

}

虽然用于简单子串查找有些“杀鸡用牛刀”,但在处理复杂文本时非常强大。

基本上就这些常见方法。日常开发中,find 足以应对大多数子串查找需求,简洁高效。遇到特殊要求时,再考虑转换大小写、使用 std::search 或正则表达式。掌握这些技巧,字符串处理会更加得心应手。

以上就是c++++中如何查找字符串中是否包含子串_c++字符串查找方法详解的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1479574.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月19日 03:54:38
下一篇 2025年12月19日 03:54:46

相关推荐

  • c++中std::move是如何实现所有权转移的_c++移动语义与所有权转移原理

    std::move是类型转换工具,将左值转为右值引用,触发移动构造函数或赋值操作,实现资源的高效转移与所有权管理。 在C++中,std::move 并不真正“移动”任何数据,它只是一个**类型转换工具**,将一个左值强制转换为右值引用(rvalue reference),从而允许调用移动构造函数或移…

    2025年12月19日
    000
  • c++如何实现一个简单的日志库 _c++日志库实现方法

    答案:实现了一个支持分级、线程安全、可输出到控制台或文件的C++单例日志库,通过宏简化调用。 实现一个简单的C++日志库,核心目标是让程序在运行过程中输出结构化的调试、警告或错误信息,并支持输出到控制台或文件。下面是一个轻量级但实用的日志系统实现方法。 1. 定义日志级别 日志通常需要区分严重程度。…

    2025年12月19日
    000
  • c++怎么实现一个对象池_c++对象池实现方法

    对象池通过预分配并复用对象来降低频繁创建销毁的开销。核心是用placement new构造和显式析构管理对象生命周期,结合内存块与空闲列表实现高效复用,需注意正确归还对象、支持扩容及线程安全。 在C++中实现对象池的核心目的是减少频繁创建和销毁对象带来的性能开销,尤其适用于生命周期短、创建成本高的对…

    2025年12月19日
    000
  • c++如何序列化和反序列化一个对象 _c++对象序列化方法详解

    C++序列化需手动或借助库实现,常见方法有:1. 手动编写serialize/deserialize函数,控制精细但维护成本高;2. 使用Boost.Serialization库,支持多种格式与复杂类型,适合大型项目;3. 采用nlohmann/json库进行JSON序列化,可读性好,适用于配置与网…

    2025年12月19日
    000
  • c++中placement new的用途是什么 _c++ placement new使用场景解析

    placement new 用于在已分配内存上构造对象,避免动态分配开销。1. 可在预分配内存(如内存池、栈数组)中直接调用构造函数,提升性能,适用于嵌入式或实时系统;2. 配合内存池实现高效对象管理,减少系统调用,便于追踪内存使用;3. 支持共享内存中构建对象,满足进程间通信需求,确保布局一致;4…

    2025年12月19日
    000
  • c++怎么使用gdb调试c++程序_c++ gdb调试命令与技巧

    使用GDB调试C++程序需先以-g编译生成调试信息,再通过gdb ./myprogram启动;用run或start运行程序,break设置断点,next和step单步执行,print查看变量值,backtrace查看调用栈;段错误时结合core dump分析可定位崩溃位置;配合layout src、…

    2025年12月19日
    000
  • c++怎么new一个对象_C++使用new关键字动态创建对象详解

    new用于在堆上分配内存并调用构造函数创建对象,支持带参构造和数组创建,需用delete或delete[]释放内存,推荐使用智能指针自动管理,避免内存泄漏。 在C++中,new 关键字用于在堆(heap)上动态分配内存,并可同时调用构造函数创建对象。相比栈上创建对象,使用 new 可以灵活控制对象的…

    2025年12月19日
    000
  • c++中cout和printf的性能差异 _c++输出性能对比与分析

    cout基于C++ iostream流机制,使用运算符重载实现类型安全输出;2. printf采用C标准库格式化字符串,直接解析格式符,性能更高。 在C++开发中,cout 和 printf 是两种常用的输出方式。虽然它们都能完成基本的输出任务,但在性能上存在差异。理解这些差异有助于在对性能敏感的场…

    2025年12月19日
    000
  • c++怎么使用map来存储键值对_c++ map容器存储键值对示例

    map是C++中用于存储唯一键值对并自动排序的关联容器,定义在头文件中,支持insert、下标等方式插入,可使用范围for或迭代器遍历,推荐用find查找以避免下标访问导致的意外插入。 在C++中,map 是一种关联容器,用于存储键值对(key-value pairs),其中每个键都唯一,并自动按照…

    2025年12月19日
    000
  • c++怎么使用std::any_c++ std::any类型使用与示例

    std::any是C++17引入的类型安全容器,可存储任意可复制类型,需包含头文件并启用C++17,适用于配置项、参数传递等场景,通过std::any_cast安全访问值,支持指针检查避免异常,可用于混合类型容器但需注意性能开销和类型安全,不支持不可复制类型,应避免滥用。 std::any 是 C+…

    2025年12月19日
    000
  • c++中什么是RAII原则及其重要性_c++ RAII资源管理机制详解

    RAII利用对象生命周期管理资源,确保构造时获取、析构时释放。C++保证析构函数在作用域结束时自动调用,即使发生异常,从而实现异常安全的资源管理。示例中MyArray在构造函数分配内存、析构函数释放内存,避免手动delete。标准库如std::unique_ptr、std::shared_ptr、s…

    2025年12月19日
    000
  • c++怎么使用OpenGL绘制图形_c++ OpenGL绘图方法

    首先配置GLFW和GLAD环境,创建窗口并初始化OpenGL;接着编写顶点和片段着色器,编译并链接为着色器程序;然后定义三角形顶点数据,设置VAO和VBO;最后在渲染循环中清除屏幕、使用着色器程序并绘制三角形。 在C++中使用OpenGL绘制图形,需要完成环境配置、上下文创建、着色器编写以及渲染流程…

    2025年12月19日
    000
  • c++怎么获取系统环境变量_c++读取系统环境变量方法

    答案是使用getenv函数获取环境变量。该函数定义于cstdlib,接收变量名,返回值指针或nullptr,需检查空指针并可转换为std::string使用,注意跨平台变量名差异。 在C++中获取系统环境变量,最常用的方法是使用标准库函数 getenv。这个函数定义在 cstdlib 头文件中,适用…

    2025年12月19日
    000
  • c++中static关键字在不同上下文中的作用 _c++ static关键字全方位解析

    static在C++中有多种用途:1. 在全局作用域中限制变量或函数的链接性,使其仅在当前编译单元内可见;2. 在类中定义静态成员变量,所有对象共享同一份数据,需在类外定义;3. 在类中定义静态成员函数,不依赖对象实例,无this指针,可直接通过类名调用。 在C++中,static关键字具有多种含义…

    2025年12月19日
    000
  • c++中public、protected、private继承的区别 _c++继承方式及访问控制解析

    public继承保持基类成员访问级别,适用于“is-a”关系;protected继承将基类public和protected成员变为protected;private继承将其变为private,用于实现复用而非接口暴露。 在C++中,继承不仅是代码复用的手段,还涉及访问控制。public、protec…

    2025年12月19日
    000
  • c++中怎么遍历一个map_c++ map遍历方式汇总

    C++中遍历map有多种方式,最推荐使用C++17的结构化绑定。1. 传统迭代器适用于所有标准,通过it->first和it->second访问键值;2. const_iterator用于只读场景,提升安全性;3. C++11起可用auto简化迭代器声明;4. 范围for循环结合cons…

    2025年12月19日
    000
  • c++中什么是多态以及如何实现_c++多态概念与实现方法总结

    多态是C++中通过继承和虚函数实现“同一接口,多种实现”的机制,允许基类指针调用派生类的重写函数,实现运行时动态绑定,提升代码灵活性与可扩展性。 多态是面向对象编程的核心特性之一,在C++中它允许不同类的对象对同一消息作出不同的响应。简单来说,就是“同一个接口,多种实现”。多态提高了代码的灵活性和可…

    2025年12月19日
    000
  • c++中类的内存对齐规则是怎样的_c++类内存对齐原理

    类的内存布局受对齐规则影响,成员按声明顺序排列但可能插入填充字节;最大成员对齐决定类整体对齐,静态成员不占实例内存,空类占1字节,虚函数引入vptr增加大小,#pragma pack可控制对齐减少体积但影响性能。 在C++中,类的内存布局和对齐方式由编译器根据硬件架构和语言标准决定。理解类的内存对齐…

    2025年12月19日
    000
  • c++中std::any的使用场景和限制 _c++ any类型使用指南

    std::any是C++17引入的类型安全容器,可存储任意类型值,适用于配置系统、插件接口、事件传递等需处理未知类型的场景。 在C++17中引入的std::any是一个类型安全的容器,可以存储任意类型的值。它属于头文件,是标准库中用于实现“泛型值”的工具之一。相比传统的void指针或联合体(unio…

    2025年12月19日
    000
  • c++中如何检查智能指针是否为空_c++智能指针判空方法

    答案:unique_ptr和shared_ptr可直接用于条件判断或与nullptr比较,而weak_ptr需通过lock()转换为shared_ptr后判空。 在C++中,检查智能指针是否为空是一个常见操作。智能指针本质上是类模板对象,它们重载了布尔转换操作符,因此可以直接在条件判断中使用。以下是…

    2025年12月19日
    000

发表回复

登录后才能评论
关注微信