C strrchr 函数
最后修改:2025 年 4 月 8 日
字符串操作在 C 编程中至关重要,而 strrchr 是查找字符串中字符最后一次出现位置的关键函数。本教程将深入探讨 strrchr,包括其语法、用法和潜在的陷阱。我们将通过实际示例进行探讨,并讨论对关键应用程序更安全的替代方案。理解 strrchr 有助于字符串解析和操作任务。
strrchr 是什么?
strrchr 函数用于定位字符串中字符的最后一次出现。它声明在 string.h 中,接受两个参数:要搜索的字符串和要查找的字符。strrchr 返回指向找到的字符的指针,如果未找到则返回 NULL。与 strchr 不同,它从字符串末尾开始搜索。对于安全关键代码,请确保输入字符串正确地以 null 结尾。
strrchr 的基本用法
此示例演示了如何在字符串中查找字符的最后一次出现。
#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 通常用于通过查找文件名中的最后一个点来查找文件扩展名。
#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 将文件名与其目录路径分离。
#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 路径,您应该改用反斜杠进行搜索。
查找句子中的最后一个空格
此示例展示了如何查找句子中的最后一个空格以将其拆分。
#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 进行不区分大小写的搜索。
#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 的最佳实践
- 检查 NULL:在使用返回值之前,务必验证它。
- 以 null 结尾的字符串:确保输入字符串正确终止。
- 指针算术:小心指针差值和类型转换。
- 字符编码:请记住它处理的是字节,而不是多字节字符。
- 性能:对于长字符串,如果性能至关重要,请考虑其他方法。
来源
本教程探讨了 strrchr 函数,从基本用法到高级注意事项。虽然简单,但如果使用得当,它在字符串操作任务中非常强大。始终验证输入并处理边缘情况,以防止程序中出现未定义的行为。
作者
列表 C 标准库。