欢迎大家来到IT世界,在知识的湖畔探索吧!
strrchr 是C语言标准库中的一个函数,定义在
头文件中。它用于在一个字符串中查找指定字符最后一次出现的位置,并返回指向该字符的指针。如果指定的字符不在字符串中,则函数返回 NULL。
函数原型
char *strrchr(const char *str, int c);
欢迎大家来到IT世界,在知识的湖畔探索吧!
入口参数:时空搜索的线索
- str – 目标字符串(时间胶囊)
- 类型:const char*
- 必须以\0结尾,例如:”2023/photo.jpg”
- 类似:一份有时间戳的历史档案
- c – 目标字符(历史标记)
- 类型:int(实际使用时会转为char)
- 例如:查找文件路径中最后一个斜杠/
- 特殊能力:可以定位\0(字符串的时空终点)
返回参数:时光机的坐标
- 找到时:返回字符最后出现的地址指针(时空坐标)
欢迎大家来到IT世界,在知识的湖畔探索吧!char *last = strrchr("hello.txt", '.'); // last指向.txt中的".",类似定位历史事件终点
- 未找到:返回NULL(时光穿越未发现痕迹)
char *ghost = strrchr("data", '@'); // ghost = NULL,如同考古未发现文物
️ 实战用法:三大时光回溯场景
场景1:提取文件扩展名(时光档案解密)
欢迎大家来到IT世界,在知识的湖畔探索吧!char filepath[] = "archive.2023.backup.zip"; char *last_dot = strrchr(filepath, '.'); if (last_dot) { printf("文件类型:%s\n", last_dot+1); // +1跳过"." // 输出:zip } else { printf("无扩展名文件"); }
场景2:获取纯文件名(剥离历史路径)
char fullpath[] = "/mnt/docs/secret/readme.md"; char *last_slash = strrchr(fullpath, '/'); if (last_slash) { printf("文件名:%s\n", last_slash+1); // 输出:readme.md } else { printf("路径中无斜杠"); }
场景3:解析日志最后记录(读取时空终点)
欢迎大家来到IT世界,在知识的湖畔探索吧!char logs[] = "[ERROR] Disk full\n" "[INFO] Backup started\n" "[WARN] High temperature\0"; char *last_newline = strrchr(logs, '\n'); if (last_newline) { printf("最后一条日志:%s\n", last_newline+1); // 输出:[WARN] High temperature }
高阶技巧:时空侦探工具箱
- 反向遍历字符串(逆时序扫描)
char data[] = "A1-B2-C3-D4"; char *p = strrchr(data, '-'); // 定位最后一个"-" while(p) { printf("找到分隔符在位置:%td\n", p - data); *p = '\0'; // 截断字符串 p = strrchr(data, '-'); // 继续向前找 } /* 输出: 找到分隔符在位置:7 找到分隔符在位置:4 找到分隔符在位置:1 */
- 与strchr组合使用(时空坐标比对)
欢迎大家来到IT世界,在知识的湖畔探索吧!char url[] = "https://www.example.com/page"; char *first_slash = strchr(url, '/'); // 第一个/ char *last_slash = strrchr(url, '/'); // 最后一个/ printf("协议结束位置:%td\n", first_slash - url); printf("资源起始位置:%td\n", last_slash - url);
- 定位字符串结尾(捕捉时空终点)
char msg[] = "Hello\0World"; // 故意嵌入\0 char *terminator = strrchr(msg, '\0'); printf("真实长度:%td\n", terminator - msg); // 输出5(而非10)
⚠️ 注意事项:避免时空悖论
- NULL检查必做
欢迎大家来到IT世界,在知识的湖畔探索吧!char *result = strrchr(str, '#'); if (!result) { // 必须处理未找到情况,否则操作空指针会引发崩溃 }
- 修改原字符串风险
char path[] = "/home/user"; char *last_slash = strrchr(path, '/'); *last_slash = '?'; // 修改最后一个/为? // 原字符串被永久改变!类似篡改历史记录
- 查找范围控制
欢迎大家来到IT世界,在知识的湖畔探索吧!// 若只需要搜索前N个字符: char tmp = str[n]; str[n] = '\0'; // 临时设置终点 char *res = strrchr(str, c); str[n] = tmp; // 恢复原状
总结:你的字符串时光机
|
特性 |
strchr(前向搜索) |
strrchr(逆向搜索) |
|
搜索方向 |
从头到尾 |
从尾到头 |
|
典型应用 |
拆分协议头、查找首个分隔符 |
获取扩展名、解析最后日志记录 |
|
时空复杂度 |
O(n) |
O(n) |
|
最佳拍档 |
strstr(子串搜索) |
strtok(字符串分割) |
通过这个时光侦探视角,你现在可以轻松驾驭strrchr函数,在字符串的世界里自由地进行逆向探索了!下次需要查找字符的最后踪迹时,记得启动你的字符串时光机
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/116017.html