C语言strrchr函数详解:时光倒流找字符的「最后踪迹」

C语言strrchr函数详解:时光倒流找字符的「最后踪迹」strrchr 是 C 语言标准库中的一个函数 定义在 string h 头文件中 它用于在一个字符串中查找指定字符最后一次出现的位置 并返回指向该字符的指针 如果指定的字符不在字符串中 则函数返回 NULL string h

欢迎大家来到IT世界,在知识的湖畔探索吧!

strrchr 是C语言标准库中的一个函数,定义在

头文件中。它用于在一个字符串中查找指定字符最后一次出现的位置,并返回指向该字符的指针。如果指定的字符不在字符串中,则函数返回 NULL。


函数原型

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

欢迎大家来到IT世界,在知识的湖畔探索吧!


入口参数:时空搜索的线索

  1. str – 目标字符串(时间胶囊)
  • 类型:const char*
  • 必须以\0结尾,例如:”2023/photo.jpg”
  • 类似:一份有时间戳的历史档案
  1. 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 }

高阶技巧:时空侦探工具箱

  1. 反向遍历字符串(逆时序扫描)
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 */
  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);
  1. 定位字符串结尾(捕捉时空终点)
char msg[] = "Hello\0World"; // 故意嵌入\0 char *terminator = strrchr(msg, '\0'); printf("真实长度:%td\n", terminator - msg); // 输出5(而非10)

⚠️ 注意事项:避免时空悖论

  1. NULL检查必做
欢迎大家来到IT世界,在知识的湖畔探索吧!char *result = strrchr(str, '#'); if (!result) { // 必须处理未找到情况,否则操作空指针会引发崩溃 }
  1. 修改原字符串风险
char path[] = "/home/user"; char *last_slash = strrchr(path, '/'); *last_slash = '?'; // 修改最后一个/为? // 原字符串被永久改变!类似篡改历史记录
  1. 查找范围控制
欢迎大家来到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

(0)
上一篇 1天前
下一篇 1天前

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们YX

mu99908888

在线咨询: 微信交谈

邮件:itzsgw@126.com

工作时间:时刻准备着!

关注微信