【std::string】find函数

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


在C++的std::string中,find方法是用于在字符串中查找子串或字符的核心成员函数,其作用是定位目标内容在当前字符串中首次出现的位置。

一、核心功能

find方法会从字符串的指定位置(默认从起始位置,即索引0)开始,搜索目标子串(或字符),并返回其首次出现的起始索引;若未找到,则返回特殊值std::string::npos

二、函数原型(常用重载版本)

std::stringfind方法有多个重载版本,覆盖不同的查找需求,常用的有以下几种:

  1. 查找字符

    从指定位置pos开始,查找单个字符c

    cpp 复制代码
    size_t find(char c, size_t pos = 0) const;
  2. 查找std::string子串

    从指定位置pos开始,查找子串s

    cpp 复制代码
    size_t find(const std::string& s, size_t pos = 0) const;
  3. 查找C风格字符串(以\0结尾)

    从指定位置pos开始,查找C字符串s

    cpp 复制代码
    size_t find(const char* s, size_t pos = 0) const;
  4. 查找C风格字符串的前count个字符

    从指定位置pos开始,查找C字符串s的前count个字符:

    cpp 复制代码
    size_t find(const char* s, size_t pos, size_t count) const;

三、返回值说明

  • 若找到目标,返回目标内容在当前字符串中首次出现的起始索引(索引从0开始)。
  • 若未找到,返回std::string::npos(这是一个静态常量,通常等价于size_t(-1),用于表示"未找到")。

四、使用示例

以下示例基于字符串str = "hello world, hello cpp"演示find的用法:

cpp 复制代码
#include <iostream>
#include <string>

int main() {
    std::string str = "hello world, hello cpp";

    // 1. 查找字符 'o'(默认从位置0开始)
    size_t pos1 = str.find('o');
    if (pos1 != std::string::npos) {
        std::cout << "字符 'o' 首次出现位置:" << pos1 << "\n"; // 输出:4("hello"的第4个索引)
    }

    // 2. 查找子串 "hello"(从位置0开始)
    size_t pos2 = str.find("hello");
    if (pos2 != std::string::npos) {
        std::cout << "子串 \"hello\" 首次出现位置:" << pos2 << "\n"; // 输出:0
    }

    // 3. 从位置6开始查找子串 "hello"(跳过第一个"hello")
    size_t pos3 = str.find("hello", 6);
    if (pos3 != std::string::npos) {
        std::cout << "从位置6开始,子串 \"hello\" 首次出现位置:" << pos3 << "\n"; // 输出:13
    }

    // 4. 查找不存在的子串 "java"
    size_t pos4 = str.find("java");
    if (pos4 == std::string::npos) {
        std::cout << "子串 \"java\" 未找到\n"; // 输出此句
    }

    return 0;
}

五、注意事项

  1. 索引范围pos参数需小于字符串长度(str.size()),否则可能返回npos(未定义行为,建议确保pos有效)。
  2. 区分大小写find是大小写敏感的,例如查找"Hello"和"hello"会被视为不同子串。
  3. 返回值类型 :返回值为size_t(无符号整数),若用int接收可能导致负数转换问题,建议直接用size_tauto
  4. npos的判断 :必须用== std::string::npos判断是否找到,不能用== -1(尽管值可能相同,但size_t是无符号类型,逻辑上不严谨)。

六、与其他查找方法的区别

std::string还提供了其他查找相关方法,可根据需求选择:

  • rfind:从字符串末尾反向查找(最后一次出现的位置)。
  • find_first_of:查找目标中任意字符首次出现的位置。
  • find_last_of:查找目标中任意字符最后一次出现的位置。

find是最基础的"正向全匹配"查找,是字符串搜索的首选方法。

相关推荐
鱼子星_15 分钟前
【C++】反向迭代器:反向迭代器的底层认识与模拟实现
开发语言·c++·笔记·stl
郝学胜-神的一滴20 分钟前
[简化版 GAMES 104] 现代游戏引擎 05:游戏引擎世界构建核心机制深度解析
c++·程序人生·unity·游戏引擎·计算机图形学·opengl
Darkwanderor32 分钟前
C++的流简介和简单使用
开发语言·c++
乐观勇敢坚强的老彭42 分钟前
C++ STL 常用容器的速查表
java·c++·算法
lingran__1 小时前
C++ STL map 与 set 底层剖析与模拟实现万字详解|基于红黑树,复刻 SGI-STL 泛型复用架构
开发语言·c++·stl·set·map·泛型编程·sgi-stl
星轨初途2 小时前
LeetCode 热题 100——day11 滑动窗口最大值
数据结构·c++·算法·leetcode·职场和发展
重生之小比特2 小时前
【初阶C++】内存管理
c++·内容运营
不会代码的小猴11 小时前
21. 泛型编程上
开发语言·c++·笔记·算法
青瓦梦滋11 小时前
传输层UDP/TCP协议
linux·网络·c++·网络协议·tcp/ip·udp
一只旭宝12 小时前
细讲C加加【9】C++ std::function与std::bind详解|仿函数、绑定器、类成员绑定、占位符、成员偏移指针
开发语言·c++·算法