ZetCode

C strrchr 函数

最后修改:2025 年 4 月 8 日

字符串操作在 C 编程中至关重要,而 strrchr 是查找字符串中字符最后一次出现位置的关键函数。本教程将深入探讨 strrchr,包括其语法、用法和潜在的陷阱。我们将通过实际示例进行探讨,并讨论对关键应用程序更安全的替代方案。理解 strrchr 有助于字符串解析和操作任务。

strrchr 是什么?

strrchr 函数用于定位字符串中字符的最后一次出现。它声明在 string.h 中,接受两个参数:要搜索的字符串和要查找的字符。strrchr 返回指向找到的字符的指针,如果未找到则返回 NULL。与 strchr 不同,它从字符串末尾开始搜索。对于安全关键代码,请确保输入字符串正确地以 null 结尾。

strrchr 的基本用法

此示例演示了如何在字符串中查找字符的最后一次出现。

basic_search.c
#include <stdio.h>
#include <string.h>

int main() {
    const char *str = "Hello, World!";
    char ch = 'o';
    
    char *result = strrchr(str, ch);
    
    if (result != NULL) {
        printf("Last '%c' found at position: %ld\n", ch, result - str);
        printf("Remaining string: %s\n", result);
    } else {
        printf("Character '%c' not found\n", ch);
    }

    return 0;
}

在这里,strrchr 在字符串中搜索最后一个 'o'。它返回指向该字符的指针,我们使用它来计算其位置。结果指针与字符串开头的差值即为索引。这是查找字符串中任何字符的最后一次出现的一种简单方法。务必检查 NULL 以处理未找到字符的情况。

查找文件扩展名

strrchr 通常用于通过查找文件名中的最后一个点来查找文件扩展名。

file_extension.c
#include <stdio.h>
#include <string.h>

int main() {
    const char *filename = "document.backup.pdf";
    char *dot = strrchr(filename, '.');
    
    if (dot != NULL) {
        printf("File extension: %s\n", dot + 1);
    } else {
        printf("No extension found\n");
    }

    return 0;
}

此示例查找文件名中的最后一个点以提取实际的扩展名。文件名中常见的点不止一个,因此 strrchr 在这里非常理想。该函数返回指向点的指针,因此我们从下一个字符开始打印。此技术适用于大多数文件名解析场景。请注意,它不验证文件名结构。

提取目录路径

此示例演示了如何使用 strrchr 将文件名与其目录路径分离。

path_extraction.c
#include <stdio.h>
#include <string.h>

int main() {
    const char *path = "/home/user/docs/report.txt";
    char *last_slash = strrchr(path, '/');
    
    if (last_slash != NULL) {
        printf("Directory: %.*s\n", (int)(last_slash - path), path);
        printf("Filename: %s\n", last_slash + 1);
    } else {
        printf("No directory found\n");
    }

    return 0;
}

在这里,strrchr 查找路径字符串中的最后一个斜杠。我们使用指针算术分别打印目录部分和文件名。%.*s 格式说明符用于打印特定数量的字符。这是在类 Unix 系统中进行路径操作的常用技术。对于 Windows 路径,您应该改用反斜杠进行搜索。

查找句子中的最后一个空格

此示例展示了如何查找句子中的最后一个空格以将其拆分。

last_space.c
#include <stdio.h>
#include <string.h>

int main() {
    const char *sentence = "The quick brown fox jumps over the lazy dog";
    char *last_space = strrchr(sentence, ' ');
    
    if (last_space != NULL) {
        printf("Last word: %s\n", last_space + 1);
        printf("Rest of sentence: %.*s\n", 
               (int)(last_space - sentence), sentence);
    } else {
        printf("No spaces found\n");
    }

    return 0;
}

strrchr 定位句子中的最后一个空格,使我们能够将其拆分成两部分。第一部分包含最后一个空格之前的所有内容,第二部分包含最后一个单词。此技术对于文本处理任务很有用。请注意,它不特别处理多个连续空格。对于更复杂的解析,可以考虑使用 strtok 或正则表达式。

不区分大小写的搜索

此示例演示了使用 strrchr 进行不区分大小写的搜索。

case_insensitive.c
#include <stdio.h>
#include <string.h>
#include <ctype.h>

char *strrchri(const char *s, int ch) {
    char *last = NULL;
    char c = tolower(ch);
    
    while (*s) {
        if (tolower(*s) == c) {
            last = (char *)s;
        }
        s++;
    }
    
    return last;
}

int main() {
    const char *text = "Hello World, hello universe";
    char *result = strrchri(text, 'H');
    
    if (result != NULL) {
        printf("Last 'H' (case-insensitive) found at: %ld\n", result - text);
        printf("Remaining text: %s\n", result);
    } else {
        printf("Character not found\n");
    }

    return 0;
}

由于 strrchr 是区分大小写的,因此我们实现了一个自定义的 strrchri 函数。它在比较之前将两个字符都转换为小写。该函数扫描整个字符串,记住最后一个匹配项。这种方法效率不如 strrchr,但对于不区分大小写的搜索是必需的。对于生产代码,请考虑使用特定于平台的、不区分大小写的字符串函数(如果可用)。

使用 strrchr 的最佳实践

来源

C strrchr 文档

本教程探讨了 strrchr 函数,从基本用法到高级注意事项。虽然简单,但如果使用得当,它在字符串操作任务中非常强大。始终验证输入并处理边缘情况,以防止程序中出现未定义的行为。

作者

我的名字是 Jan Bodnar,我是一名敬业的程序员,对编码充满热情。自 2007 年以来,我通过 1,400 多篇文章和 8 本电子书分享了我的专业知识。凭借十多年的教学经验,我致力于让编程变得易于理解和引人入胜。

列表 C 标准库