函数简介
strrchr 是 C 标准库 <string.h> 中的一个函数,它的名字来源于 "string reverse character"(字符串反向字符查找)。
功能:在一个字符串中从后向前查找指定字符最后一次出现的位置,并返回一个指向该位置的指针。
函数原型:
char *strrchr(const char *str, int c);
参数说明
str:要被搜索的源字符串,它是一个指向常量字符的指针,意味着strrchr不会修改这个字符串。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' 出现在
example和strrchr.中。 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' 未在字符串中找到。
strrchr 与 strchr 的区别
这是一个非常重要的对比点,可以帮助你更好地理解这两个函数。
| 特性 | 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的关系:strrchr是strchr的反向版本,一个找“第一个”,一个找“最后一个”。
