news 2026/7/4 18:19:22

C语言 strstr 的模拟实现(附有画图)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C语言 strstr 的模拟实现(附有画图)

1.分情况讨论

strstr 函数的功能:

用来在一个字符串内搜索一个子串的首次出现位置的函数。如果找到了子串,strstr会返回子串首次出现的地址;如果没有找到,则返回NULL。

匹配字符串时会出现 2 种情况。

case 1:

char arr1[]="abcedf"; char arr2[]="bcd";

case 2:

char arr1[] = "abbbcd"; char arr2[] = "bbc";

case 1 是简单的子字符串寻找,一次就能匹配到;case 2 是比较复杂的子字符串寻找,需要多次匹配。

2.画图说明

接下来画图说明 case 2:

str1中匹配子字符串的每一个字符,s1 和 s2 都指向字符串的起始位置,让 s1 s2 指向的字符进行匹配,如果不匹配, 移动 s1到下一个字符。

发现 str1 和 str2 的字符是一样的,就有字符串匹配成功的可能,当s1 s2 都走到:

画图中的位置时,子字符串没有和 str1 的字符串匹配成功,需要用第3个变量 p来记录str1中和子字符串开始匹配字符的下一个字符的位置( 第 2 个 b ),作为s1重新匹配的起点,再次和回到起始位置的 str2(子字符串) 进行重新匹配。如果匹配成功就返回第二个b的地址。为了记录匹配失败的字符的后一个字符的位置,就需要 变量 p 在开始的时候也指向 str1。

于是用 变量 p 在第一个字符开始记录,没匹配成功,让 p 记录在当前位置(匹配失败字符)的下一个字符的位置,给 s1 赋值 p, s2也回到起始位置再次匹配 ,直到 p已经到了 \0。如果找到了,就提前返回会 p, 如果到了 \0 还没找到,就返回 NULL。

3.代码实现

char* MyStrstr(const char* str1, const char* str2) { assert(str1 && str2); const char* s1 = str1; const char* s2 = str2; const char* p = str1; while (*p) { s1 = p; s2 = str2; while (*s1!='\0' && *s2!='\0' && *s1 == *s2) { s1++; s2++; } //要么匹配失败停止循环,要么字符都匹配*s2==0,说明匹配成功返回地址 if (*s2 == '\0') { return (char*) p; } p++; } return NULL; } int main() { char arr1[] = "abbbcd"; char arr2[] = "bbc"; char * ret=MyStrstr(arr1, arr2); if (ret == NULL) { printf("子串不存在\n"); } else { printf("%s\n", ret); } return 0; }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/4 18:18:00

STM32与MAX9744构建高效数字音频系统

1. 为什么选择MAX9744与STM32F215ZG组合?在音频功率放大领域,D类放大器因其高效率特性逐渐成为主流方案。MAX9744作为Analog Devices推出的20W立体声D类音频功放芯片,其核心优势在于以D类架构实现了接近AB类放大器的音质表现。实测数据显示&a…

作者头像 李华
网站建设 2026/7/4 18:16:12

AI开发工程化:驾驭工程方法论与实践指南

1. 项目概述:AI开发中的工程化思维在AI项目开发过程中,我们常常会遇到这样的困境:模型在实验环境下表现优异,一旦部署到生产环境就出现各种问题;团队成员各自为战,代码难以复用和维护;项目周期不…

作者头像 李华
网站建设 2026/7/4 18:14:28

Gemma 4深度评测:轻量级开源大模型的工程范式重置

1. 项目概述:为什么Gemma 4突然让整个轻量级AI圈都坐直了身子 “谷歌Gemma 4开源评测:轻量级王者再进化,开发者体验如何”——这个标题里藏着三个关键信号: Gemma (不是Llama、不是Phi、是谷歌亲自下场的轻量级正统血…

作者头像 李华
网站建设 2026/7/4 18:14:22

大模型数据准备实战:高信噪比语料构建七步法

1. 为什么说“数据准备”才是训练定制大模型时最耗神、也最值钱的环节你有没有过这种体验:花两周时间调参、换架构、折腾分布式训练,最后发现模型在业务场景里答非所问,逻辑混乱,甚至编造事实?我带过三支不同行业的LLM…

作者头像 李华
网站建设 2026/7/4 18:09:59

本地化AI编程助手:基于Codex与DeepSeek构建免代理智能体工作流

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Claude 随心用,限时 5 折。 👉 点击领海量免费额度 1. 背景与核心概念 在AI编程工具日益普及的今天,许多开发者都渴望将强大的大模型能力无缝集成到自己的开发工作流中&…

作者头像 李华
网站建设 2026/7/4 18:08:43

M24256E与PIC32MX795F512L嵌入式存储方案设计

1. 为什么选择M24256E与PIC32MX795F512L组合?在嵌入式系统设计中,数据存储的可靠性往往决定了整个产品的生命周期和用户体验。M24256E这颗256Kb容量的EEPROM芯片,与PIC32MX795F512L这款MIPS架构的32位微控制器搭配,形成了工业级应…

作者头像 李华