当前位置: 首页 > news >正文

strchr 与 strstr 函数详解

一.strchr - 字符查找函数

1.函数原型

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

2.核心功能

在字符串中查找特定字符的第一次出现位置

3.参数说明

参数 类型     说明

str    const char* 要搜索的字符串

c      int         要查找的字符(自动转换为char)

4.返回值

找到:返回指向该字符的指针

未找到:返回NULL

特殊:c = '\0' 时返回字符串结尾的空字符位置

5.用法示例

(1)基础查找

#include <stdio.h>

#include <string.h>

int main() {

    const char *text = "Hello, World!";

    char *ptr = strchr(text, 'W');

    

    if(ptr) {

        printf("找到 'W',位置: %ld\n", ptr - text); // 输出: 7

        printf("后续内容: %s\n", ptr);              // 输出: World!

    } else {

        printf("未找到字符\n");

    }

    return 0;

}

(2)查找文件扩展名

char filename[] = "document.pdf";

char *dot = strchr(filename, '.');

if(dot) {

    printf("文件扩展名: %s\n", dot + 1); // 输出: pdf

} else {

    printf("无扩展名\n");

}

(3)统计字符出现次数

int count_char(const char *str, char c) {

    int count = 0;

    const char *ptr = str;

    

    while((ptr = strchr(ptr, c)) != NULL) {

        count++;

        ptr++; // 移动到下一个位置继续搜索

    }

    return count;

}

// 使用示例

char sentence[] = "She sells seashells by the seashore";

int s_count = count_char(sentence, 's');

printf("'s'出现次数: %d\n", s_count); // 输出: 7

二.strstr - 子串查找函数

1.函数原型

char *strstr(const char *haystack, const char *needle);

2.核心功能

在字符串中查找特定子串的第一次出现位置

3.参数说明

参数  类型     说明

haystack  const char* 被搜索的主字符串

needle  const char* 要查找的子字符串

4.返回值

找到:返回指向子串起始位置的指针

未找到:返回NULL

特殊:needle为空字符串时返回haystack

5.用法示例

(1)基础子串查找

#include <stdio.h>

#include <string.h>

int main() {

    const char *text = "The quick brown fox jumps over the lazy dog";

    char *found = strstr(text, "fox");

    

    if(found) {

        printf("找到子串,位置: %ld\n", found - text); // 输出: 16

        printf("后续内容: %s\n", found);              // 输出: fox jumps over...

    } else {

        printf("未找到子串\n");

    }

    return 0;

}

(2)检查文件类型

int is_image_file(const char *filename) {

    const char *extensions[] = {".jpg", ".png", ".gif", ".bmp"};

    

    for(int i = 0; i < 4; i++) {

        if(strstr(filename, extensions[i]) != NULL) {

            return 1; // 是图片文件

        }

    }

    return 0; // 不是图片文件

}

// 使用示例

if(is_image_file("vacation.jpg")) {

    printf("这是图片文件\n");

}

(3)提取HTML标签内容

void extract_html_content(const char *html) {

    const char *start = strstr(html, "<title>");

    if(!start) return;

    

    start += 7; // 跳过"<title>"

    

    const char *end = strstr(start, "</title>");

    if(!end) return;

    

    // 计算标题长度

    size_t len = end - start;

    char title[len + 1];

    strncpy(title, start, len);

    title[len] = '\0';

    

    printf("页面标题: %s\n", title);

}

// 使用示例

extract_html_content("<html><title>Welcome Page</title></html>");

// 输出: 页面标题: Welcome Page

三.两函数对比分析

四.实际应用场景

1.命令行参数解析

int main(int argc, char *argv[]) {

    int verbose = 0;

    char *output_file = NULL;

    

    for(int i = 1; i < argc; i++) {

        if(strstr(argv[i], "--help")) {

            print_help();

            return 0;

        }

        else if(strstr(argv[i], "--verbose")) {

            verbose = 1;

        }

        else if(strchr(argv[i], '=')) {

            parse_key_value(argv[i]);

        }

    }

    // ...

}

2.日志文件分析

void analyze_log(const char *logfile) {

    FILE *file = fopen(logfile, "r");

    if(!file) return;

    

    char line[256];

    int error_count = 0, warning_count = 0;

    

    while(fgets(line, sizeof(line), file)) {

        if(strstr(line, "[ERROR]")) error_count++;

        else if(strstr(line, "[WARNING]")) warning_count++;

    }

    

    printf("错误数: %d\n警告数: %d\n", error_count, warning_count);

    fclose(file);

}

http://www.xdnf.cn/news/1103761.html

相关文章:

  • Go语言中的组合式接口设计模式
  • UNet改进(21):门控注意力机制在UNet中的应用与优化
  • 深度学习归一化方法维度参数详解(C/H/W/D完全解析)
  • mysql报错服务没有报告任何错误
  • Cursor、飞算JavaAI、GitHub Copilot、Gemini CLI 等热门 AI 开发工具合集
  • 【科研绘图系列】R语言绘制系统发育树和柱状图
  • 微积分核心考点全解析
  • Immutable
  • PID 算法的原理与应用 (通俗易懂)
  • 信号肽预测工具PrediSi本地化
  • RHCE 认证考试要点精讲之如何更好使用基础工具
  • 计算机网络第三章(5)——数据链路层《广域网》
  • 多表查询-2-多表查询概述
  • AWS控制台升级EKS版本
  • 小智AI模型接入MCP
  • 后台管理系统-权限管理
  • 深度体验飞算JavaAI:一场Java开发效率的革命
  • 【数据结构】8. 二叉树
  • React中Redux基础和路由介绍
  • React 的常用钩子函数在Vue中是如何设计体现出来的。
  • Qt 实现新手引导
  • QT控件 使用QtServer系统服务实现搭建Aria2下载后台服务,并使用Http请求访问Json-RPC接口调用下载退出
  • Grok-4 发布会图文总结
  • docker宿主机修改ip后起不来问题解决
  • 前端面试专栏-算法篇:22.树结构(二叉树、B树、红黑树)
  • 游戏开发日记
  • MyBatis02-mybatis-config.xml配置文件讲解
  • 【深度探究系列(5)】:前端开发打怪升级指南:从踩坑到封神的解决方案手册
  • 基于kafka的分布式日志收集与实时监控平台(原理,框架)
  • 黑马点评系列问题之P55优惠券秒杀 快捷键问题 Ctrl+D显示不出来老师给的界面