strrchr如何从右往左查找指定字符?

99ANYc3cd6
预计阅读时长 14 分钟
位置: 首页 C语言 正文

函数简介

strrchr 是 C 标准库 <string.h> 中的一个函数,它的名字来源于 "string reverse character"(字符串反向字符查找)。

功能:在一个字符串中从后向前查找指定字符最后一次出现的位置,并返回一个指向该位置的指针。

函数原型

char *strrchr(const char *str, int c);

参数说明

  1. str:要被搜索的源字符串,它是一个指向常量字符的指针,意味着 strrchr 不会修改这个字符串。
  2. c:要查找的目标字符,注意,它的类型是 int,但通常我们只使用它的最低 8 位(即一个 char 值)。c 的值是 '\0' (字符串结束符),函数也会查找它。

返回值

  • 成功:返回一个指向 str 中字符 c 最后一次出现的位置的指针,这个指针指向的是字符 c 本身,而不是它前面的字符。
  • 失败:如果字符串 str 中不存在字符 c,则返回 NULL (空指针)。

工作原理

strrchr 会从字符串的末尾开始,向前逐个字符地扫描,直到找到第一个匹配的 c,因为它是从后往前找,所以它找到的是最后一个匹配项。

代码示例

下面通过几个例子来理解 strrchr 的用法。

示例 1:查找普通字符

#include <stdio.h>
#include <string.h>
int main() {
    const char *text = "This is a simple example for strrchr.";
    char target = 'e';
    // 查字符 'e' 最后一次出现的位置
    char *result = strrchr(text, target);
    if (result != NULL) {
        // result 指向 'e',result - text 'e' 的索引
        printf("字符 '%c' 最后一次出现在索引 %ld 处,\n", target, result - text);
        printf("该字符后面的子字符串是: \"%s\"\n", result);
    } else {
        printf("字符 '%c' 未在字符串中找到,\n", target);
    }
    return 0;
}

输出:

字符 'e' 最后一次出现在索引 33 处。
该字符后面的子字符串是: "example for strrchr."

分析

  • 字符串中 'e' 出现在 examplestrrchr. 中。
  • strrchr 从后往前找,所以找到了最后一个 e
  • result 指向这个 e
  • result - text 计算出从字符串开头到这个 e 有多少个字符,即索引 33。
  • result 开始打印字符串,就会得到从该 e 开始到末尾的所有内容。

示例 2:查找字符串结束符 \0

#include <stdio.h>
#include <string.h>
int main() {
    const char *text = "hello world";
    char target = '\0'; // 查找字符串结束符
    char *result = strrchr(text, target);
    if (result != NULL) {
        printf("字符串结束符 '\\0' 的地址是: %p\n", (void*)result);
        printf("字符串结束符 '\\0' 的索引是: %ld\n", result - text);
    } else {
        printf("未找到字符串结束符,\n");
    }
    return 0;
}

输出:

字符串结束符 '\0' 的地址是: 0x55f8b1c1b0b6
字符串结束符 '\0' 的索引是: 11

分析

  • 任何有效的 C 字符串都以 '\0'
  • strrchr 总是能找到 '\0',并且它就在字符串的末尾。
  • result - text 的值等于字符串的长度(不包括 '\0' 本身)。

示例 3:字符未找到

#include <stdio.h>
#include <string.h>
int main() {
    const char *text = "programming";
    char target = 'x';
    char *result = strrchr(text, target);
    if (result != NULL) {
        printf("找到了字符 '%c',\n", target);
    } else {
        printf("字符 '%c' 未在字符串中找到,\n", target);
    }
    return 0;
}

输出:

字符 'x' 未在字符串中找到。

strrchrstrchr 的区别

这是一个非常重要的对比点,可以帮助你更好地理解这两个函数。

特性 strrchr (Reverse) strchr (Standard)
查找方向 从后向前 (从字符串末尾向开头) 从前向后 (从字符串开头向末尾)
查找目标 最后一次出现的位置 第一次出现的位置
函数原型 char *strrchr(const char *str, int c); char *strchr(const char *str, int c);
返回值 指向最后一个 c 的指针 指向第一个 c 的指针

对比示例:

#include <stdio.h>
#include <string.h>
int main() {
    const char *str = "abracadabra";
    char c = 'a';
    char *first_pos = strchr(str, c);  // 第一次出现的 'a'
    char *last_pos = strrchr(str, c);   // 最后一次出现的 'a'
    if (first_pos && last_pos) {
        printf("字符串: \"%s\"\n", str);
        printf("字符 '%c' 第一次出现在索引 %ld,\n", c, first_pos - str);
        printf("字符 '%c' 最后一次出现在索引 %ld,\n", c, last_pos - str);
    }
    return 0;
}

输出:

字符串: "abracadabra"
字符 'a' 第一次出现在索引 0。
字符 'a' 最后一次出现在索引 10。
  • 用途:当你需要知道一个字符在字符串中最后一次出现的位置时,使用 strrchr
  • 返回值:返回的是指向该字符的指针,而不是索引,通过指针减法 (result - str) 可以得到索引。
  • 查找 '\0'strrchr 总是能找到字符串的结尾 '\0',这可以用来获取字符串的长度。
  • 未找到:如果找不到,返回 NULL,在使用返回的指针前务必进行检查,避免解引用空指针导致程序崩溃。
  • strchr 的关系strrchrstrchr 的反向版本,一个找“第一个”,一个找“最后一个”。
-- 展开阅读全文 --
头像
dede移动端静态化如何实现?
« 上一篇 前天
织梦编辑器如何高效编辑文章?
下一篇 » 前天

相关文章

取消
微信二维码
支付宝二维码