深入探索C语言中的字符串处理函数:strstr与strtok
在C语言的字符串处理领域, strstr 和 strtok 是两个非常重要的函数,它们各自承担着独特的功能,为开发者处理字符串提供了强大的支持。
一、strstr函数:字符串查找的利器
strstr 函数用于在一个字符串中查找另一个字符串的首次出现位置。其函数原型如下:
char *strstr(const char *haystack, const char *needle);
- haystack 是被查找的主字符串,就像在干草堆里找针,这个干草堆就是 haystack 。
- needle 是要查找的子字符串,即那根“针”。
1. 基本使用示例
#include <stdio.h>
#include <string.h>
int main() {
const char *haystack = "Hello, world! This is a test string.";
const char *needle = "world";
char *result = strstr(haystack, needle);
if (result) {
printf("找到了子字符串,位置是: %ld\n", result - haystack);
} else {
printf("未找到子字符串\n");
}
return 0;
}
在这个例子中,我们在 haystack 字符串中查找 needle 子字符串。如果找到, strstr 会返回一个指向 needle 在 haystack 中首次出现位置的指针,通过计算这个指针与 haystack 起始地址的差值,我们就能得到子字符串的位置。
2. 原理剖析
strstr 函数通常采用朴素的字符串匹配算法。它从 haystack 的第一个字符开始,依次与 needle 的第一个字符进行比较。如果匹配,就继续比较后续字符;如果不匹配, haystack 的比较位置就向后移动一位,重新开始比较。这种算法的时间复杂度在最坏情况下为O(m * n),其中m是 haystack 的长度,n是 needle 的长度。虽然有更高效的字符串匹配算法,如KMP算法,但 strstr 的实现相对简单,在大多数情况下也能满足需求。
3. 注意事项
- strstr 函数对大小写敏感。如果需要进行不区分大小写的查找,需要自己实现额外的逻辑,比如将两个字符串都转换为大写或小写后再进行比较。
- 当 needle 为空字符串时, strstr 会返回 haystack 本身,因为空字符串被认为在任何字符串的开头都存在。
二、strtok函数:字符串分割的能手
strtok 函数用于将字符串按照指定的分隔符进行分割。其函数原型如下:
char *strtok(char *str, const char *delim);
- str 是要分割的字符串。
- delim 是包含分隔符的字符串。
1. 基本使用示例
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "apple,banana;cherry:date";
const char *delim = ",;:";
char *token = strtok(str, delim);
while (token!= NULL) {
printf("Token: %s\n", token);
token = strtok(NULL, delim);
}
return 0;
}
在这个例子中,我们使用 strtok 函数将 str 字符串按照 , , ; 和 : 进行分割。第一次调用 strtok 时,传入要分割的字符串 str 和分隔符 delim ,之后每次调用 strtok 时,第一个参数传入 NULL ,表示继续从上一次分割结束的位置开始分割。
2. 原理剖析
strtok 函数内部维护了一个静态变量来记录上一次分割的位置。当第一次调用时,它会在 str 中查找第一个出现的分隔符,将分隔符替换为 '\0' ,并返回指向分割出的第一个子字符串的指针。后续调用传入 NULL 时,它会从上次记录的位置继续查找下一个分隔符,重复上述操作。这种方式使得 strtok 能够方便地对字符串进行逐段分割,但也意味着它不适合多线程环境,因为静态变量会被多个线程共享,导致数据竞争。
3. 注意事项
- strtok 会修改被分割的字符串,将分隔符替换为 '\0' 。如果需要保留原始字符串,应该先进行复制。
- 由于内部使用静态变量,在多线程环境下使用 strtok 需要特别小心,可以考虑使用线程安全的替代函数,如 strtok_r (在POSIX系统中可用)。
三、总结
strstr 和 strtok 是C语言字符串处理的重要工具。 strstr 专注于字符串查找,让我们能快速定位子字符串的位置; strtok 则擅长字符串分割,帮助我们将复杂的字符串拆分成有意义的片段。深入理解它们的工作原理、使用方法和注意事项,能够让我们在处理字符串相关任务时更加得心应手,编写出高效、健壮的代码。无论是开发小型程序还是大型项目,这两个函数都可能在关键环节发挥重要作用。
相关文章:
深入探索C语言中的字符串处理函数:strstr与strtok
在C语言的字符串处理领域, strstr 和 strtok 是两个非常重要的函数,它们各自承担着独特的功能,为开发者处理字符串提供了强大的支持。 一、strstr函数:字符串查找的利器 strstr 函数用于在一个字符串中查找另一个字符串的首次出现…...
Django学习笔记(第一天:Django基本知识简介与启动)
博主毕业已经工作一年多了,最基本的测试工作已经完全掌握。一方面为了解决当前公司没有自动化测试平台的痛点,另一方面为了向更高级的测试架构师转型,于是重温Django的知识,用于后期搭建测试自动化平台。 为什么不选择Java&#x…...
npm版本号标记
在 npm 中,版本号的标记遵循 语义化版本控制(Semantic Versioning, SemVer) 的规则,版本号通常由 主版本号(major)、次版本号(minor) 和 修订版本号(patch) 组成,格式为: <major>.<minor>.<patch>1. 版本号格式 主版本号(major):当你做了不兼…...
无人机雨季应急救灾技术详解
无人机在雨季应急救灾中发挥着至关重要的作用,其凭借机动灵活、反应迅速、高效安全等特点,为救灾工作提供了强有力的技术支撑。以下是对无人机雨季应急救灾技术的详细解析: 一、无人机在雨季应急救灾中的应用场景 1. 灾情侦查与监测 无人机…...
算法与数据结构(多数元素)
题目 思路 方法一:哈希表 因为要求出现次数最多的元素,所以我们可以使用哈希映射存储每个元素及其出现的次数。每次记录出现的次数若比最大次数大,则替换。 方法二:摩尔算法 摩尔的核心算法就是对抗,因为存在次数多…...
详解如何使用Pytest内置Fixture tmp_path 管理临时文件
关注开源优测不迷路 大数据测试过程、策略及挑战 测试框架原理,构建成功的基石 在自动化测试工作之前,你应该知道的10条建议 在自动化测试中,重要的不是工具 临时目录在测试中起着至关重要的作用,它为执行和验证代码提供了一个可控…...
量子计算的五大优势
量子计算的优势有哪些? 量子计算是一个快速发展的领域,有望彻底改变我们处理复杂计算问题的方式。那么,量子计算的优势是什么?与经典计算相比,量子计算又有哪些优势呢?当我们探索量子力学的世界以及量子系…...
行内元素和块级元素
行内元素和块级元素 1.行内元素1.1什么是行内元素1.2行内元素的特点1.3常见的行内元素 2.块级元素2.1什么是块级元素2.2块级元素的特点2.3常见的块级元素 3.行内元素和块级元素的区别 1.行内元素 1.1什么是行内元素 行内元素是指在网页中不会独占一行,而是与其他行内元素在同…...
java面试题-集合篇
Collection 1.Collection有哪些类? Java集合框架中的Collection接口是所有集合类的基础接口,定义了一些基本的集合操作,如添加元素、删除元素、判断是否包含某个元素等。常见的集合类包括List、Set和Queue。 List List接口定义了按照索引…...
二十九、vite项目集成webpack+vue2项目
一、开发 基座应用: 1、安装依赖 npm i @micro-zoe/micro-app@0.8.6 --save 2、在入口处引入(main.ts) import microApp from @micro-zoe/micro-appmicroApp.start()...
小程序之间实现互相跳转的逻辑
1:小程序之间可以实现互相跳转吗 可以实现互相跳转! 2:小程序跳转是否有限制 有限制!限制如下 2.1:需要用户触发跳转 从 2.3.0 版本开始,若用户未点击小程序页面任意位置,则开发者将无法调用此接口自动跳转至其他小程序。 2.2:需要用户确认跳转 从 2.3.0 版本开始…...
算法——数学建模的十大常用算法
数学建模的十大常用算法在数学建模竞赛和实际问题解决中起着至关重要的作用。以下是这些算法的具体信息、应用场景以及部分算法的C语言代码示例(由于篇幅限制,这里只给出部分算法的简要代码或思路,实际应用中可能需要根据具体问题进行调整和扩…...
cookie、session、jwt、Oauth2.0、sso 分别有什么用
cookie、session、jwt都是 web 应用中的认证方式,最早只有 cookie,后面觉得所有数据存储在客户端不安全,就出现了 cookie-session,再后面有了 jwt。 cookie工作原理 cookie 数据存储在用户的本地。服务器完全根据 cookie 确定访…...
maven使用默认settings.xml配置时,Idea基于pom.xml更新依赖时报错,有些组件下载时连接超时
1、问题背景:maven使用默认settings.xml配置时,Idea基于pom.xml更新依赖时报错,有些组件下载时连接超时, 通过日志发下,去连接maven.org网站下载依赖,有时候肯定会超时。 2、解决办法:使用国外…...
信息收集-Web应用搭建架构指纹识别WAF判断蜜罐排除开发框架组件应用
知识点: 1、信息收集-Web应用-架构分析&指纹识别 2、信息收集-Web应用-架构分析&WAF&蜜罐 3、信息收集-Web应用-架构分析&框架组件识别 指纹识别 EHole_magic https://github.com/lemonlove7/EHole_magic 指纹识别 Wappalyzer https://github.com…...
蓝桥杯之图
图: 对于图来说,重点在于之后的最短路径算法,这边简单做一下了解即可...
ProxySQL构建PolarDB-X标准版高可用路由服务三节点集群
ProxySQL构建PolarDB-X标准版高可用路由服务三节点集群 一、PolarDB-X标准版主备集群搭建 三台机器上传 polardbx 包,包可以从官网https://openpolardb.com/download获取,这里提供离线rpm。 1、上传 polardbx 安装包 到 /opt目录下 rpm -ivh t-pol…...
【leetcode】双指针:移动零 and 复写零
文章目录 1.移动零2.复写零 1.移动零 class Solution { public:void moveZeroes(vector<int>& nums) {for (int cur 0, dest -1; cur < nums.size(); cur)if (nums[cur] ! 0)swap(nums[dest], nums[cur]);} };class Solution { public:void moveZeroes(vector&l…...
正则化(Regularization)和正则表达式(Regular Expression)区别
文章目录 1. **正则化(Regularization)**2. **正则表达式(Regular Expression)**关键区别为什么名字相近? 正则化(Regularization)和正则表达式(Regular Expression)不是…...
【C++】C++-教师信息管理系统(含源码+数据文件)【独一无二】
👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉专__注👈:专注主流机器人、人工智能等相关领域的开发、测试技术。 【C】C教师信息管理系统(含源码&#x…...
MySql从入门到精通
第一部分 基础篇 1.概述 1.1 启动与停止MySql 启动 net start mysql80 停止 net stop mysql80 注意: mysql开机默认启动 1.2 客户端连接 方法一:使用MySQL提供的命令行客户端方法二:系统自带的命令行工具执行指令 mysql [-h 127.0.0.1] …...
27、深度学习-自学之路-NLP自然语言处理-做一个简单的项目识别一组电影评论,来判断电影评论是积极的,还是消极的。
一、如果我们要做这个项目,第一步我们要做的就是需要有对应的训练数据集。 这里提供两个数据集,一个是原始评论数据集《reviews.txt》,以及对应的评论是消极还是积极的数据集《labels.txt》,下面的程序就是找到这两个数据集&…...
微信小程序 - 组件和样式
组件和样式介绍 在开 Web 网站的时候: 页面的结构由 HTML 进行编写,例如:经常会用到 div、p、 span、img、a 等标签 页面的样式由 CSS 进行编写,例如:经常会采用 .class 、#id 、element 等选择器 但在小程序中不能…...
滤波总结 波形处理原理 如何对一个规律的波形进行滤波 显现出真正的波形 如何设计滤波
需要用到的软件:waveserialport vofa++ 1.波形想用MCU进行采集首先你要考虑到你的采集频率因为如果你的对象波形即你要采集的波形,他过于快速的话有一些MCU它是不能的比如说有一些它的主频才36兆72兆呢你如果遇到一个特别快的波形毫秒级别那他就检测不了 2.…...
【代码随想录】刷题记录(115)-岛屿数量(广搜)
题目描述: 题目描述 给定一个由 1(陆地)和 0(水)组成的矩阵,你需要计算岛屿的数量。岛屿由水平方向或垂直方向上相邻的陆地连接而成,并且四周都是水域。你可以假设矩阵外均被水包围。 输入描…...
Git指南-从入门到精通
代码提交和同步命令 流程图如下: 第零步: 工作区与仓库保持一致第一步: 文件增删改,变为已修改状态第二步: git add ,变为已暂存状态 bash $ git status $ git add --all # 当前项目下的所有更改 $ git add . # 当前目录下的所有更改 $ g…...
uvm错误记录4
如下所示,奇怪的是penable莫名其妙的出X。可问题,我发送激励了。 仔细定位发现,39行用的是vif中的penable, 问题是都是赋值,却出现同时赋值多次,这是因为nonblocking和blocking同时触发导致的,因此…...
用大模型学大模型03-数学基础 概率论
https://metaso.cn/s/Jp0OU9w 提示词:我正在学习深度学习相关的数学知识,学到了概率论与统计学部分,给我一个入门级的完整教程和实例。 好的,我现在需要回答用户关于深度学习所需的概率论与统计学入门教程和实例的问题。用户希望得到一个完整…...
数字电路-基础逻辑门实验
基础逻辑门是数字电路设计的核心元件,它们执行的是基本的逻辑运算。通过这些基本运算,可以构建出更为复杂的逻辑功能。常见的基础逻辑门包括与门(AND)、或门(OR)、非门(NOT)、异或门…...
基于springboot轨道交通安全评估系统(源码+lw+部署文档+讲解),源码可白嫖!
摘要 时代在飞速进步,每个行业都在努力发展现在先进技术,通过这些先进的技术来提高自己的水平和优势,轨道交通安全评估管理当然不能排除在外。轨道交通安全评估系统是在实际应用和软件工程的开发原理之上,运用Java语言以及Spring…...
多能互补综合能源系统,改变能源结构---安科瑞 吴雅芳
多能互补综合能源系统是一种通过整合多种能源的形势(如电力、天然气、热能、冷能等)和多种能源技术(如可再生能源、储能技术、智能电网等),实现能源利用和配置调整的系统。其目标是通过多能互补和协同优化,…...
Python 量化
Python 量化是指利用 Python 编程语言以及相关的库和工具来进行金融市场数据分析、策略开发和交易执行的过程。 Python 由于其简洁、易学、强大的生态系统和丰富的金融库而成为量化交易的首选编程语言之一。 量化交易在金融领域得到广泛应用,它允许交易者通过系统…...
图数据库Neo4j面试内容整理-属性(Property)
在图数据库中,属性(Property)是用来描述节点(Node)和关系(Relationship)详细信息的键值对。属性可以附加到节点或关系上,用来存储具体的数据,如名字、年龄、时间戳、标签等。属性使得节点和关系不仅能够表示实体或交互,还能包含丰富的、与实体或交互相关的信息。 1. …...
uniapp - iconfont下载本地并且运用至项目上
1、项目中创建一个文件夹放置iconfont相关文件,例如src/assets/iconfont(名称自己定义) 2、在iconfont下载项目至本地 3、解压后把文件复制进1的文件夹中 4、修改src/assets/iconfont - iconfont.css里的font-face的src地址,修…...
leetcode 1594. 矩阵的最大非负积
题目如下 数据范围 示例 本题难就难在矩阵存在负数,我们可以先思考如果矩阵每个数都大于等于0那么很简单我们只需要维护左边和上面的最大值即可。那么如果遇到负数显然要得到最大值就要和左边和右边的最小值相乘。所以这里我们维护两个二维数组用于存从(0,0)开…...
Vue3 从入门到精通:全面掌握前端框架的进阶之路
一、Vue3 简介 Vue.js 是一款流行的 JavaScript 前端框架,用于构建用户界面。Vue3 作为 Vue.js 的重大升级版本,带来了诸多性能提升和新特性。它采用了 Proxy 实现数据响应式系统,优化了虚拟 DOM 算法,使得应用在运行时更加高效。…...
lightning.pytorch.callbacks内置的Callbacks介绍
PyTorch Lightning 提供了一些 内置回调 (Callback),可以在训练过程中自动执行 检查点保存、学习率调度、早停 等功能。通过使用 Trainer(callbacks=[...]) 来传入这些回调。 PyTorch Lightning 的 Callback 是一种强大的工具,允许用户在训练过程中插入自定义逻辑,而无需修…...
网络运维与网络安全技术分享
网络运维与网络安全介绍之二 在上阶段给大家基本介绍了网络运维与网络安全专业第一阶段的内容之后,接下来,我们就开始进入正式内容分享了! 第一阶段:运维基础与网络系统管理之Windows系统的安装部署以及常见Windows应用技巧。 在这…...
基于巨控GRM242Q-4D4I4QHE模块的农村供水自动化监控技术方案
一、系统架构设计 拓扑结构: 传感器层(液位/压力/流量)→ 巨控GRM242Q模块 → 4G网络 → 云平台 → 手机/PC监控端硬件配置: 核心设备:GRM242Q-4D4I4QHE模块(4DI/4DO/4AI/1485)传感器࿱…...
Java 单元测试框架之 Mockito 详细介绍
本文是博主在学习如何高效创建单元测试时的知识记录,文中项目代码是基于 SpringBoot 项目,测试组件使用的 JUnit 5,单元测试组件使用的 Mockito 。虽然现在都是在使用 AI 助手帮助生成单元测试和代码辅助修改,但我们不能被工具挡住…...
对比 LVS 负载均衡群集的 NAT 模式和 DR 模式,比较其各自的优势 , 基于 openEuler 构建 LVS-DR 群集。
对比 LVS 负载均衡群集的 NAT 模式和 DR 模式,比较其各自的优势 NAT模式的优势: 可以隐藏后端服务器的IP地址,提高了系统的安全性。 支持多个后端服务器共享同一个IP地址,提高了系统的可扩展性。 可以在负载均衡器和后端服务…...
mapbox V3 新特性,添加下雪效果
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象…...
谈谈云计算、DeepSeek和哪吒
我不会硬蹭热点,去分析自己不擅长的跨专业内容,本文谈DeepSeek和哪吒,都是以这两个热点为引子,最终仍然在分析的云计算。 这只是个散文随笔,没有严谨的上下游关联关系,想到哪里就写到哪里。 “人心中的成见…...
深入HBase——引入
引入 前面我们通过深入HDFS到深入MapReduce ,从设计和落地,去深入了解了大数据最底层的基石——存储与计算是如何实现的。 这个专栏则开始来看大数据的三驾马车中最后一个。 通过前面我们对于GFS和MapReduce论文实现的了解,我们知道GFS在数…...
【前端】【vue】vue2/3,nuxt的插槽使用详解
插槽在Vue2、Vue3和不同版本Nuxt中的使用 Vue2中的插槽 基础插槽 在Vue2中,基础插槽允许在组件的模板中定义一个占位符,然后在使用组件时插入自定义内容。例如,创建一个简单的MyBox组件: <template><div class"…...
逆境、情绪低落时可用的锦囊、咒语
《浮生一梦》(一) 大多数人都经历过逆境低谷、失败、挫折、看似无端情绪低落、抑郁… 人逢情绪低落时,几乎任何话都听不进去,再正的能量也塞不进脑子,笑话笑不出来,食不知味… 复原力不强者很难走出来&am…...
【目标检测json2txt】label从COCO格式json文件转YOLO格式txt文件
目录 🍀🍀1.COCO格式json文件 🌷🌷2.YOLO格式txt文件 💖💖3.xml2json代码(python) 🐸🐸4.输入输出展示 🙋🙋4.1输入json 🍂🍂4.2输出txt 整理不易,欢迎一键三连!!! 送你们一条美丽的--分割线-- 🍀🍀1.COCO格式json文件 COCO数…...
ASP.NET Core SixLabors.ImageSharp 位图图像创建和下载
从 MVC 控制器内部创建位图图像并将其发送到浏览器;用 C# 编写并与 Linux 和 Windows 服务器兼容。 使用从 ASP.NET MVC 中的控制器下载任何文件类型File。 此示例创建一个位图 (jpeg) 并将其发送到浏览器。它需要 NuGet 包SixLabors.ImageSharp v1.0.4。 另请参…...
Java开发实战:使用IntelliJ IDEA 开发Spring Boot + MyBatis + MySQL的详细实现步骤
使用IntelliJ IDEA 开发Spring Boot MyBatis MySQL的详细实现步骤 在本文中,我们将一步步讲解如何在IntelliJ IDEA 2024.2.3中使用Spring Boot、MyBatis和MySQL来开发一个简单的Web应用。通过本文,你将学会如何设置项目、配置数据库、创建实体类、编写…...
python-leetcode-在排序数组中查找元素的第一个和最后一个位置
34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode) class Solution:def searchRange(self, nums: List[int], target: int) -> List[int]:def find_first(nums, target):left, right 0, len(nums) - 1result -1while left < rig…...