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

【C语言】strstr查找字符串函数

一、函数介绍

strstr 是 C 语言标准库 <string.h> 中的字符串查找函数,用于在主字符串中查找子字符串的首次出现位置。若找到子串,返回其首次出现的地址;否则返回 NULL。它是处理字符串匹配问题的核心工具之一。

二、函数原型

char *strstr(const char *haystack, const char *needle);
  • 参数说明

    • haystack:主字符串(被查找的字符串)。

    • needle:子字符串(要查找的目标)。

  • 返回值

    • 找到时:返回子串首次出现的指针地址

    • 未找到时:返回 NULL

  • 特点:区分大小写,如 "Hello" 中查找 "hello" 会失败。

三、基础用法示例

1. 查找成功场景

#include <stdio.h>
#include <string.h>int main() 
{char str[] = "Welcome to MY CSDN blog!";char sub[] = "CSDN";char *result = strstr(str, sub);if (result != NULL){printf("找到子串!位置:%ld\n", result - str);  // 输出:找到子串!位置:14printf("匹配内容:%s\n", result);              // 输出:CSDN blog!
} 
else 
{printf("未找到子串。\n");
}return 0;
}

 2. 查找失败场景

char *result = strstr("Apple", "app");  // 返回NULL(大小写敏感)

 四.模拟实现
const char* my_strstr(const char* str1, const char* str2)
{const char* s1 = NULL;const char* s2 = NULL;const char* cur = str1;assert(str1 && str2);if (*str2 == '\0')//特殊场景return str1;while (*cur){s1 = cur;s2 = str2;while (*s1 && *s2  && *s1 == *s2){s1++;s2++;}if (*s2 == '\0')return cur;cur++;}return NULL;
}int main()
{char arr1[] = "abbbcdef";char arr2[] = "bbc";const char* ret = my_strstr(arr1, arr2);if (ret == NULL)printf("找不到\n");elseprintf("%s\n", ret);return 0;
}
分析:

这里需要创造三个指针,cur用来储存运算的地址。

1.   进行外层while循环(*cur)判断条件逐个往后排序知道遇到\0,在外层循环中,s1 被初始化为当前的 cur 位置,即 str1 中的当前位置;s2 被初始化为 str2 的起始位置。再进行内层while循环,while的判断条件是
     1  *s1 和 *s2 都不为 \0(即两个字符串都没有到达末尾)
     2.  *s1 == *s2(即当前字符相同)。

     3. 如果上述条件都满足,则 s1 和 s2 都向后移动一个字符位置(s1++ 和 s2++),继续比较下一个字符。(这一行代码确保了在两个字符串都不为空且当前字符相等的情况下,继续比较下一个字符,从而实现字符串的逐字符匹配。)

匹配结果:

内层的 while 循环结束时,检查 *s2 是否为 \0。如果是,则说明 str2 已经完全匹配了 str1 中的一个子串,此时返回 cur,即匹配开始的位置。

如果不是,则继续外层循环,从 str1 的下一个字符开始重新尝试匹配。(cur++)

如果外层循环结束且没有找到匹配的子串,则返回 NULL

总结:

外层循环遍历 str1 的每一个可能的起始位置,内层循环则负责从该位置开始逐字符比较 str1 和 str2,直到找到匹配的子串或确定没有匹配为止。

相关文章:

【C语言】strstr查找字符串函数

一、函数介绍 strstr 是 C 语言标准库 <string.h> 中的字符串查找函数&#xff0c;用于在主字符串中查找子字符串的首次出现位置。若找到子串&#xff0c;返回其首次出现的地址&#xff1b;否则返回 NULL。它是处理字符串匹配问题的核心工具之一。 二、函数原型 char …...

使用pkexec 和其策略文件安全提权执行外部程序

‌一、pkexec 基本机制‌ pkexec 是 Linux 桌面环境下基于 ‌PolicyKit‌ 的安全提权工具&#xff0c;可通过交互式图形界面获取用户授权后&#xff0c;以 root 权限执行指定程序。其核心特点包括&#xff1a; ‌图形化密码输入‌&#xff1a;调用时自动弹出系统认证对话框&a…...

NVIDIA显卡

NVIDIA显卡作为全球GPU技术的标杆&#xff0c;其产品线覆盖消费级、专业级、数据中心、移动计算等多个领域&#xff0c;技术迭代贯穿架构创新、AI加速、光线追踪等核心方向。以下从技术演进、产品矩阵、核心技术、生态布局四个维度展开深度解析&#xff1a; 一、技术演进&…...

机器学习、深度学习和神经网络

机器学习、深度学习和神经网络 术语及相关概念 在深入了解人工智能&#xff08;AI&#xff09;的工作原理以及它的各种应用之前&#xff0c;让我们先区分一下与AI密切相关的一些术语和概念&#xff1a;人工智能、机器学习、深度学习和神经网络。这些术语有时会被交替使用&#…...

数字孪生在智慧城市中的前端呈现与 UI 设计思路

一、数字孪生技术在智慧城市中的应用与前端呈现 数字孪生技术通过创建城市的虚拟副本&#xff0c;实现了对城市运行状态的实时监控、分析与预测。在智慧城市中&#xff0c;数字孪生技术的应用包括交通流量监测、环境质量分析、基础设施管理等。其前端呈现主要依赖于Web3D技术、…...

黑莓手机有望回归:搭载 Android 15、支持 AI

据 3 月 31 日快科技消息&#xff0c;有博主称一家英国的初创公司正悄悄努力复活 BlackBerry Classic 及 OnwardMobility 未完成的产品。 从爆料的信息看&#xff0c;黑莓新手机将具备 5G、AMOLED 显示屏、12GB RAM 和 256GB 或 512GB 存储空间等高端配置&#xff0c;同时运行 …...

Android OpenGLES 360全景图片渲染(球体内部)

概述 360度全景图是一种虚拟现实技术&#xff0c;它通过对现实场景进行多角度拍摄后&#xff0c;利用计算机软件将这些照片拼接成一个完整的全景图像。这种技术能够让观看者在虚拟环境中以交互的方式查看整个周围环境&#xff0c;就好像他们真的站在那个位置一样。在Android设备…...

LETTERS(DFS)

【题目描述】 给出一个rowcolrowcol的大写字母矩阵&#xff0c;一开始的位置为左上角&#xff0c;你可以向上下左右四个方向移动&#xff0c;并且不能移向曾经经过的字母。问最多可以经过几个字母。 【输入】 第一行&#xff0c;输入字母矩阵行数RR和列数SS&#xff0c;1≤R,S≤…...

嵌入式海思Hi3861连接华为物联网平台操作方法

1.1 实验目的 快速演示 1、认识轻量级HarmonyOS——LiteOS-M 2、初步掌握华为云物联网平台的使用 3、快速驱动海思Hi3861 WIFI芯片,连接互联网并登录物联网平台...

CMDB平台(进阶篇):3D机房大屏全景解析

在数字化转型的浪潮中&#xff0c;数据中心作为企业信息架构的核心&#xff0c;其高效、智能的管理成为企业竞争力的关键因素之一&#xff0c;其运维管理方式也正经历着革命性的变革。传统基于二维平面图表的机房监控方式已难以满足现代企业对运维可视化、智能化的需求。乐维CM…...

NVM 多版本Node.js 管理全指南(Windows系统)

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家、全栈领域优质创作者、高级开发工程师、高级信息系统项目管理师、系统架构师&#xff0c;数学与应用数学专业&#xff0c;10年以上多种混合语言开发经验&#xff0c;从事DICOM医学影像开发领域多年&#xff0c;熟悉DICOM协议及…...

C,C++语言缓冲区溢出的产生和预防

缓冲区溢出的定义 缓冲区是内存中用于存储数据的一块连续区域&#xff0c;在 C 和 C 里&#xff0c;常使用数组、指针等方式来操作缓冲区。而缓冲区溢出指的是当程序向缓冲区写入的数据量超出了该缓冲区本身能够容纳的最大数据量时&#xff0c;额外的数据就会覆盖相邻的内存区…...

《Linux内存管理:实验驱动的深度探索》【附录】【实验环境搭建 2】【vscode搭建调试内核环境】

1. 如何调试我们的内核 1. GDB调试 安装gdb sudo apt-get install gdb-multiarchgdb-multiarch是多架构版本&#xff0c;可以通过set architecture aarch64指定架构 QEMU参数修改添加-s -S #!/usr/bin/shqemu-7.2.0-rc1/build/aarch64-softmmu/qemu-system-aarch64 \-nogr…...

Flutter项目之登录注册功能实现

目录&#xff1a; 1、页面效果2、登录两种状态界面3、中间按钮部分4、广告区域5、最新资讯6、登录注册页联调6.1、网络请求工具类6.2、注册页联调6.3、登录问题分析6.4、本地缓存6.5、共享token6.6、登录页联调6.7、退出登录 1、页面效果 import package:flutter/material.dart…...

mybatis 自带的几个插入接口的区别

研究这个的原由是应为需求对一张表新增了一个有默认值的字段&#xff0c;然后调用插入接口的时候发现这个字段没有传默认值但是还是以null值入库了&#xff0c;数据库中设置的默认值没有生效。 通过排查之后发现是使用了insertUseGeneratedKeys 方法进行插入&#xff0c;此方法…...

ctfshow VIP题目限免 源码泄露

根据题目提示是源代码泄露&#xff0c;右键查看页面源代码发现了 flag...

移动神器RAX3000M路由器变身家庭云之七:增加打印服务,电脑手机无线打印

系列文章目录&#xff1a; 移动神器RAX3000M路由器变身家庭云之一&#xff1a;开通SSH&#xff0c;安装新软件包 移动神器RAX3000M路由器变身家庭云之二&#xff1a;安装vsftpd 移动神器RAX3000M路由器变身家庭云之三&#xff1a;外网访问家庭云 移动神器RAX3000M路由器不刷固…...

《函数基础与内存机制深度剖析:从 return 语句到各类经典编程题详解》

一、问答题 &#xff08;1&#xff09;使用函数的好处是什么&#xff1f; 1.提升代码的复用性 2.提升代码的可维护性 3.增强代码的可读性 4.提高代码的灵活性 5.方便进行单元测试 &#xff08;2&#xff09;如何定义一个函数&#xff1f;如何调用一个函数&#xff1f; 在Pytho…...

Python | 使用Matplotlib绘制Swarm Plot(蜂群图)

Swarm Plot&#xff08;蜂群图&#xff09;是一种数据可视化图表&#xff0c;它用于展示分类数据的分布情况。这种图表通过将数据点沿着一个或多个分类变量轻微地分散&#xff0c;以避免它们之间的重叠&#xff0c;从而更好地显示数据的分布密度和分布趋势。Swarm Plot特别适用…...

风云可测:华为AI天气大模型将暴雨预测误差缩至3公里内

华为云正式发布全球首个气象专用人工智能大模型"盘古气象"&#xff0c;实现台风路径24小时预测误差<30公里、暴雨落区72小时精度91%&#xff0c;较传统数值预报效率提升10000倍。本文基于对西北太平洋10个台风回溯测试、全国2360个气象站验证数据&#xff0c;解析…...

JavaScript基础-window.sessionStorage

在Web开发中&#xff0c;数据存储是一个非常重要的环节。它不仅关系到用户体验的提升&#xff0c;还影响着应用的状态管理与性能优化。window.sessionStorage 是一种轻量级的数据存储机制&#xff0c;允许网页在同一会话期间内保存数据。本文将详细介绍 sessionStorage 的基本概…...

新版本Xmind结合DeepSeek快速生成美丽的思维导图

前言 我的上一篇博客&#xff08;https://quickrubber.blog.csdn.net/article/details/146518898&#xff09;中讲到采用Python编程可以实现和Xmind的互动&#xff0c;并让DeepSeek来生成相应的代码从而实现对内容的任意修改。但是&#xff0c;那篇博客中提到的Xmind有版本的限…...

lodash库介绍(一个现代JavaScript实用工具库,提供模块化、性能优化和额外功能)JavaScript库(防抖、节流、函数柯里化)JS库

文章目录 Lodash库全解析简介核心优势一致性API模块化设计性能优化 常用功能分类数组操作对象操作函数增强 高级应用场景数据转换链函数组合 性能考量大数据集处理 最佳实践按需引入利用FP模块 结语 Lodash库全解析 简介 Lodash是一个现代JavaScript实用工具库&#xff0c;提…...

禾赛科技社招面经

下面面经内容是禾赛科技社招面经 Linux bsp软件工程师 一面: 1、自我介绍 2、中断里用什么锁 答:自旋锁 3、自旋锁和互斥锁的区别 答:自旋锁用在中断上下文中,适合于极短的临界区,CPU开销小,不可以阻塞 互斥锁用在进程上下文中,适用于较长的临界区,CPU开销大,可以阻塞…...

set和map封装

目录 set和map区别 set和map的插入 set和map的实现 修改红黑树的模板参数 修改比较时使用的变量 迭代器的实现 迭代器的定义 *解引用重载 ->成员访问重载 自增重载 重载 封装迭代器 RBTree迭代器封装 封装set迭代器 对set迭代器进行修改 封装map迭代器 修改…...

【Linux】Orin NX + Ubuntu22.04配置国内源

1、获取源 清华源 arm 系统的源,可以在如下地址获取到 https://mirror.tuna.tsinghua.edu.cn/help/ubuntu-ports/ 选择HTTPS,否则可能报错: 明文签署文件不可用,结果为‘NOSPLIT’(您的网络需要认证吗?)查看Orin NX系统版本 选择jammy的源 2、更新源 1)备份原配…...

Bazel中的Symbol, Rule, Macro, Target, Provider, Aspect 等概念

学习Bazel &#xff0c;就要学习Bazel 的规则定义&#xff0c; 弄清各个概念是重要的一个步骤。 在 Bazel 规则定义中&#xff0c;Symbol、Rule 和 Macro 是常见的概念。除此之外&#xff0c;Bazel 还有 Target、Provider、Aspect Repository、Package、 Workspace、 Configura…...

Open-Sora:开源AI视频生成的新星

一.引言 近年来&#xff0c;AI视频生成技术快速发展&#xff0c;从文本生成图像&#xff08;如Stable Diffusion、DALLE&#xff09;到文本生成视频&#xff08;如Runway、Pika&#xff09;&#xff0c;AI在多媒体创作领域的应用日益广泛。近期&#xff0c;Open-Sora作为一款开…...

【堆】《深入剖析优先级队列(堆):数据结构与算法的高效搭档》

文章目录 前言例题一、最后一块石头的重量二、数据流中的第 K 大元素三、前K个高频单词四、数据流的中位数 结语 前言 什么是优先级队列算法呢&#xff1f;它的算法原理又该怎么解释&#xff1f; 优先级队列&#xff08;堆&#xff09;算法是一种特殊的数据结构和算法&#xf…...

【CMOS输出缓冲器驱动强度】

一 、学习笔记 原始资料&#xff1a;https://www.ti.com.cn/cn/lit/an/zhcae18/zhcae18.pdf?ts1743589394832 Q1、电平转换芯片的其中一个关键指标是转换速率&#xff0c;转换速率跟什么因素有关系呢&#xff1f; 1、瞬态驱动强度 上升或下降时间用于评估瞬态驱动强度。需要…...