C++中rfind方法的具体使用

 更新时间:2025年10月11日 09:33:18   作者:oioihoii  
rfind是C++字符串类std::string和std::wstring的成员函数,用于从字符串的末尾向前搜索指定的子字符串或字符,本文就来详细的介绍一下rfind方法的具体使用,感兴趣的可以了解一下

rfind 是 C++ 字符串类 std::stringstd::wstring 的成员函数,用于从字符串的末尾向前搜索指定的子字符串或字符。

函数原型

// 搜索整个字符串
size_type rfind(const basic_string& str, size_type pos = npos) const noexcept;
size_type rfind(const CharT* s, size_type pos = npos) const;
size_type rfind(CharT ch, size_type pos = npos) const noexcept;

// C++17 新增:带长度的版本
size_type rfind(const CharT* s, size_type pos, size_type count) const;

参数说明

  • str / s / ch:要搜索的子字符串或字符
  • pos:开始搜索的位置(从该位置向前搜索)
  • count:要搜索的字符数(仅用于指针版本)

返回值

  • 如果找到,返回匹配子串的起始位置(从 0 开始)
  • 如果未找到,返回 std::string::npos

源码解析

以下是 rfind 的简化实现原理:

#include <iostream>
#include <string>
#include <cstring>

// 简化的 rfind 实现原理
size_t simplified_rfind(const std::string& str, const std::string& pattern, size_t pos = std::string::npos) {
    // 如果 pos 超过字符串长度,调整到字符串末尾
    if (pos >= str.length()) {
        pos = str.length() - 1;
    }
    
    // 如果模式串为空,返回 pos(标准行为)
    if (pattern.empty()) {
        return (pos < str.length()) ? pos : str.length();
    }
    
    // 如果模式串比原字符串长,肯定找不到
    if (pattern.length() > str.length()) {
        return std::string::npos;
    }
    
    // 从 pos 开始向前搜索
    for (size_t i = pos; i >= pattern.length() - 1; --i) {
        bool found = true;
        
        // 检查当前位置是否匹配模式串
        for (size_t j = 0; j < pattern.length(); ++j) {
            if (str[i - pattern.length() + 1 + j] != pattern[j]) {
                found = false;
                break;
            }
        }
        
        if (found) {
            return i - pattern.length() + 1;
        }
        
        // 处理无符号整数的下溢
        if (i == 0) break;
    }
    
    return std::string::npos;
}

使用示例

#include <iostream>
#include <string>

int main() {
    std::string text = "Hello, World! Hello, C++!";
    
    // 1. 搜索子字符串
    size_t pos1 = text.rfind("Hello");
    std::cout << "Last 'Hello' at position: " << pos1 << std::endl; // 输出 14
    
    // 2. 搜索字符
    size_t pos2 = text.rfind('o');
    std::cout << "Last 'o' at position: " << pos2 << std::endl; // 输出 19
    
    // 3. 从指定位置向前搜索
    size_t pos3 = text.rfind("Hello", 10);
    std::cout << "Last 'Hello' before position 10: " << pos3 << std::endl; // 输出 0
    
    // 4. 搜索不存在的字符串
    size_t pos4 = text.rfind("Python");
    if (pos4 == std::string::npos) {
        std::cout << "'Python' not found" << std::endl;
    }
    
    // 5. 使用指针和长度
    const char* search_str = "Hello";
    size_t pos5 = text.rfind(search_str, text.length(), 3); // 只搜索前3个字符 "Hel"
    std::cout << "Last 'Hel' at position: " << pos5 << std::endl;
    
    return 0;
}

实际应用场景

#include <iostream>
#include <string>

// 提取文件扩展名
std::string getFileExtension(const std::string& filename) {
    size_t dotPos = filename.rfind('.');
    if (dotPos != std::string::npos && dotPos < filename.length() - 1) {
        return filename.substr(dotPos + 1);
    }
    return "";
}

// 提取目录路径
std::string getDirectory(const std::string& path) {
    size_t slashPos = path.rfind('/');
    if (slashPos != std::string::npos) {
        return path.substr(0, slashPos + 1);
    }
    return "";
}

// 查找最后一个单词
std::string getLastWord(const std::string& sentence) {
    size_t lastSpace = sentence.rfind(' ');
    if (lastSpace != std::string::npos) {
        return sentence.substr(lastSpace + 1);
    }
    return sentence; // 没有空格,返回整个字符串
}

int main() {
    std::string filename = "document.backup.txt";
    std::string path = "/home/user/documents/file.txt";
    std::string sentence = "The quick brown fox";
    
    std::cout << "File extension: " << getFileExtension(filename) << std::endl;
    std::cout << "Directory: " << getDirectory(path) << std::endl;
    std::cout << "Last word: " << getLastWord(sentence) << std::endl;
    
    return 0;
}

性能特点

  • 时间复杂度:最坏情况 O(n×m),其中 n 是搜索范围,m 是模式串长度
  • 空间复杂度:O(1)
  • 适用场景:适合在长字符串中查找较短的模式串

注意事项

  1. rfind 从后向前搜索,但返回的位置是从字符串开头计算的
  2. 如果 pos 参数为 npos,则从字符串末尾开始搜索
  3. 空字符串的搜索总是会成功(返回 pos 或字符串长度)
  4. 注意处理 npos 的返回值

rfind 是字符串处理中非常有用的工具,特别适合需要从后向前搜索的场景,如文件路径处理、URL 解析等。

到此这篇关于C++中rfind方法的具体使用的文章就介绍到这了,更多相关C++ rfind内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言控制台实现打飞机小游戏

    C语言控制台实现打飞机小游戏

    这篇文章主要为大家详细介绍了C语言控制台实现打飞机小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • C语言邻接表建立图详解

    C语言邻接表建立图详解

    这篇文章主要介绍了C语言邻接表建立图,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • C语言的空类型指针,空指针,野指针详解

    C语言的空类型指针,空指针,野指针详解

    这篇文章主要介绍了C语言的空类型指针,空指针,野指针的详解及用法示例,介绍了其相关概念,然后分享了几种用法,具有一定参考价值。需要的朋友可以了解下。
    2021-09-09
  • C语言中回调函数的含义与使用场景详解

    C语言中回调函数的含义与使用场景详解

    这篇文章主要为大家详细介绍了C语言中回调函数的含义与使用场景,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • 迷宫游戏控制台版C++代码

    迷宫游戏控制台版C++代码

    这篇文章主要为大家详细介绍了迷宫游戏控制台版C++代码,可以调整大小的迷宫游戏,给定迷宫的入口,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • C/C++实现去除字符串中的空格(附带源码)

    C/C++实现去除字符串中的空格(附带源码)

    这篇文章主要为大家详细介绍了C/C++实现去除字符串中的空格的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-11-11
  • C++数据结构之list详解

    C++数据结构之list详解

    list是一种序列式容器。list容器完成的功能实际上和数据结构中的双向链表是极其相似的,list中的数据元素是通过链表指针串连成逻辑意义上的线性表,也就是list也具有链表的主要优点,即:在链表的任一位置进行元素的插入、删除操作都是快速的
    2021-11-11
  • 用C语言实现二分查找算法

    用C语言实现二分查找算法

    大家好,本篇文章主要讲的是c语言实现二分查找法,感性的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2022-01-01
  • C++如何切割String对象的方法

    C++如何切割String对象的方法

    C++相较于Java,Python 并没有提供的字符串分割的函数split,因此需要自己进行编写,本文主要介绍了C++如何切割String对象的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • VC++获得当前进程运行目录的方法

    VC++获得当前进程运行目录的方法

    这篇文章主要介绍了VC++获得当前进程运行目录的方法,可通过系统函数实现该功能,是非常实用的技巧,需要的朋友可以参考下
    2014-10-10

最新评论