C进阶_字符串查找库函数

news2024/10/6 12:31:20

strstr

查找strstr的文档,可知它的原型为:

char *strstr( const char *string, const char *strCharSet );

它的返回值,根据文档是这样的: 

Return Value

Each of these functions returns a pointer to the first occurrence of strCharSet in string, or NULL if strCharSet does not appear in string. If strCharSet points to a string of zero length, the function returns string.

可知会返回一个指针,指向目标字符串在strCharSet中第一次出现的位置。如果没有,就返回一个空指针。

简单地说,就是查找子字符串。

由于返回值是指针,那么接收返回值就要用指针类型来接收。

#include <stdio.h>
#include <string.h>
int main()
{
	char arr1[] = "abbbcdbbcef";
	char arr2[] = "bbc";
	char* ret = strstr(arr1, arr2);
	if (ret == NULL)
	{
		printf("找不到\n");
	}
	else
	{
		printf("%s\n", ret);
	}
	return 0;
}

输出结果如下:

如果我把arr2改成bbcq,那么在arr1中找不到arr2,就会返回空指针:

 

 现在来模拟实现strstr。

分为两种情况。

情况1:

这种情况较为简单,arr1首先指向a,arr2指向b,a和b不相等,那么arr1指向下一个字符,此时arr2仍指向b,此时arr1和arr2指向的字符相等,那么arr2指向下一个字符,arr1也指向下一个字符,发现arr1和arr2指向的字符相等,那么arr2指向下一个字符,这时指向了\0,就停止了查找。

情况2:

arr1最开始指向a,arr2最开始指向b。

arr1和arr2所指向的字符不相等,那么arr1就指向下一个字符,arr2仍指向第一个b,此时arr1和arr2指向的字符相等,那么arr2指向下一个字符,arr1也指向下一个字符,发现arr1和arr2指向的字符相等,那么arr1和arr2继续指向下一个字符,此时arr1和arr2分别所指向的字符不相等,而此时arr2也不能向前指了,那么就停止了查找。

显而易见,这是有问题的!问题就在于第一个字符串里明明有第二个字符串的存在,却没有查找到。

正确的做法是,arr1指向出现的第二个b,arr2指向第一个字符,然后重新查找。

那么此时就需要有一些临时变量,不要用arr1和arr2亲自查找。

可以这样来实现模拟strstr:

#include <string.h>
#include <assert.h>
char* my_strstr(const char* str1, const char* str2)
{
	assert(str1 && str2);
	if (*str2 == '\0')//用于判断srr2是不是空字符串
	{
		return (char*)str1;
	}
	const char* s1 = NULL;
	const char* s2 = NULL;
	const char* cp = str1;
	while (*cp)//当*cp为0时终止循环
	{
		s1 = cp;
		s2 = str2;//内循环每次开始前s2都指向要查找的字符串首元素,s1指向被查找的字符串里下一个字符
		while (*s1 !='\0' && *s2!='\0' && *s1 == *s2)
		{
			s1++;
			s2++;//只要字符串不结束并且指向的字符相等就循环
		}
		if (*s2 == '\0')//如果条件成立,说明找到了子字符串
		{
			return (char*)cp;
		}
		cp++;
	}
	return NULL;
}

strtok

这个函数不管是使用还是原理,都相当独特。其原型如下:

char *strtok( char *strToken, const char *strDelimit );

sep参数是个字符串,定义了用作分隔符的字符集合。

第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标
记。

strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。(注:
strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容
并且可修改。)

strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串
中的位置。

strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标
记。

如果字符串中不存在更多的标记,则返回 NULL 指针。

字符串superverybest@outlooks.net是由@和.切开的,@和.其实就是分隔符。那么要将superverybest、outlooks、net分隔开,可以这样:

#include <stdio.h>
#include <string.h>
int main()
{
	char arr[] = "superverybest@outlooks.net";
	char* p = "@.";
	char buf[50] = { 0 };
	strcpy(buf, arr);
	char* ret = NULL;
	for (ret = strtok(buf, p); ret != NULL; ret=strtok(NULL, p))
	{
		printf("%s\n", ret);
	}
	return 0;
}

输出结果为:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/168526.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用 YonBuilder 进行报表分析 - 扩展篇

使用 YonBuilder 进行报表分析 - 扩展篇 在上一篇文章中&#xff0c;我们讲解了如何构建简单的报表以及交叉表的基础配置。本篇文章通过对主子表、树型表以及数据穿透的创建来对 YonBuilder 的报表配置进行扩展介绍。 创建报表 首先&#xff0c;要先创建一个员工信息实体&…

CSS选择器整理学习(中)

书接上回&#xff0c;在前端项目开发中&#xff0c;有时候需要对特殊的元素进行特殊的处理&#xff0c;但有时候元素的位置不确定、层级不确定、数量不确定等问题&#xff0c;导致我们没办法进行元素的选择&#xff0c;这个时候我们就需要用到元素选择器了。 一、CSS选择器 1…

加油站视频监控智能分析盒基于yolov5

加油站视频监控智能分析盒基于yolov5人工智能视觉技术&#xff0c;对现场画面中明火和烟雾以及人员抽烟、打电话等违规行为进行识别。除此之外&#xff0c;还可以对现场画面中卸油时灭火器未按要求正确摆放以及静电释放时间不足和人员离岗等不规范行为进行自动预警。YOLOv5在YO…

【云原生】k8s图形化管理攻击之rancher

内容预知 前言 1. Rancher的相关知识 1.1 Rancher的简介 1.2 Rancher与k8s的关系及区别 1.3 Rancher具有的优势 2. Rancher的安装部署 2.1 实验环境与部署图分配 2.2 具体的部署操作 &#xff08;1&#xff09;在 rancher 节点下载 rancher 镜像 &#xff08;2&#xff…

程序员同事每天准点下班,原来是用了这6个开发工具

工欲善其事必先利其器&#xff0c;要想更加高效的做事情&#xff0c;就得先将工具变得锋利。那么对于程序员来说同样也是如此&#xff0c;如果要想每天早点下班&#xff0c;就必须借助于一些开发工具来提高自己的工作效率&#xff0c;今天就给大家总结一些工作中常用到的工具。…

【算法题解】11. 判断链表是否有环,并返回入环节点

文章目录题目解法一&#xff1a;循环标记Java代码实现Go 代码实现复杂度分析解法二&#xff1a;快慢指针Java 代码实现Go 代码实现复杂度分析这是一道 中等难度 的题&#xff0c;是 判断链表是否有环 的扩展&#xff0c;在有环的情况下返回入环节点&#xff0c; 依然是两种解法…

Disney 流媒体广告 Flink 的应用实践

摘要&#xff1a;本文整理自 Disney 广告智能执行总监郝又超、Disney 广告智能实时计算负责人李丁哲&#xff0c;在 FFA 主会场的分享。本篇内容主要分为四个部分&#xff1a;Disney 流媒体广告与实时应用业务场景实现实时平台构建未来展望Tips&#xff1a;点击「阅读原文」查看…

kafka.2 集群搭建

文章目录1.启动kakfa自带的zk2.启动kafka集群3.查看zookeeper的kafka节点信息启停kafka集群脚本创建主题增加分区模拟生产消费模拟消费组消费主题&#xff0c;查看offset1.启动kakfa自带的zk 参考&#xff1a;https://blog.csdn.net/justlpf/article/details/127261664?utm_m…

通俗易懂的java设计模式(7)-原型模式

1.什么是原型模式&#xff1f; 原型模式提供了一种创建对象的模式&#xff0c;它是指用原型实例创建对象的种类&#xff0c;并且通过拷贝这些原型&#xff0c;创建新的对象。用一个很生动形象的例子&#xff1a;孙悟空拔出一根猴毛&#xff0c;变出其他和自己一模一样的小孙悟…

Linux三剑客之Sed

目录 一、认识sed 二、使用sed 命令格式 常用选项options 地址定界 编辑命令command sed用法 常用选项&#xff1a; 地址界定演示 编辑命令command演示 sed高级编辑命令 一、认识sed sed 是一种流编辑器&#xff0c;它一次处理一行内容。处理时&#xff0c;把当前处理的行…

《Linux Shell脚本攻略》学习笔记-第九章

9.1 简介 计算机系统是由一组硬件及控制这些硬件的软件组成的。 Linux既提供了能够检查这些系统当前性能的交互式程序&#xff0c;也提供了用于记录一段时间内系统性能表现的模块。 9.2 监视磁盘使用情况 磁盘空间是一种有限的资源。 du和df命令可以报告磁盘使用情况&#xff0…

消息中间件如何选型 图解 Kafka vs RabbitMQ vs RocketMQ 的差异

综述 Kafka 采用拉取 ( Pull) 方式消费消息&#xff0c;吞吐量相对更高&#xff0c;适合海量数据收集与传递场景&#xff0c;例如日志采集和集中分析缺点 Kafka 单机超过 64 个队列/分区&#xff0c;Load 会发生明显的飙高现象&#xff0c;队列越多&#xff0c;load 越高&#…

linux基本功系列之chage命令实战

文章目录前言一. chage命令的介绍二. 常用案例示范1. 查看用户密码的有效期2. 设置密码的过期时间3. 设置账号的失效时间总结前言 前言&#x1f680;&#x1f680;&#x1f680; 想要学好Linux&#xff0c;命令是基本功&#xff0c;企业中常用的命令大约200多个&#xff0c;不管…

2023牛客寒假算法基础集训营1

题解 | #2023牛客寒假算法基础集训营1#_牛客博客 (nowcoder.net) //本人能力有限&#xff0c;以下只附上本人get到的题&#xff0c;其他参考以上链接或其他 A World Final? World Cup! (I) 链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 …

【自学Docker 】Docker top命令

Docker top命令 大纲 docker top教程 使用 docker top 命令可以用来查看 Docker 中运行的进程信息。docker top 命令后面的 CONTAINER 可以是容器 ID&#xff0c;或者是容器名。 docker top语法 haicoder(www.haicoder.net)# docker top [OPTIONS] CONTAINER [ps OPTIONS]案…

说话的三重复杂性

从0开始首先要有一个说话者&#xff0c;这个说话者说出来的话有三重有意。说话者想要表达的东西。文字本身的意义。倾听者所理解的意义。例子&#xff1a;说话者问&#xff1a;有女朋友吗&#xff1f;我们假设说话者要表达&#xff0c;如果还没&#xff0c;那么一起加班。文字本…

GIS入门进阶之017

一、网络分析 网络分析是ArcGIS提供的重要的空间分析功能&#xff0c;利用它可以模拟现实世界的网络问题。如从网络数据中寻找多个地点之间的最优路径&#xff0c;确定网络中资源的流动方向、资源配置和网络服务范围等。 网络是图论和运筹学中的一个数学模型&#xff0c;通常用…

【C#】封装.net framework函数库,并打包发布dll函数库到nuget服务器

作者&#xff1a;小5聊 简介&#xff1a;一只喜欢全栈方向的程序员&#xff0c;专注基础和实战分享&#xff0c;欢迎咨询&#xff0c;尽绵薄之力答疑解惑&#xff01; 1、Nuget函数库管理工具 1.1、什么是Nuget Nuget是一个.NET平台下的开源的项目&#xff0c;它是Visual Stu…

电脑怎么设置定时关机?分享2个简单操作!

随着互联网时代的发展&#xff0c;越来越多人使用电脑。使用过程中&#xff0c;有时会产生很多疑惑&#xff0c;其中有朋友问小编&#xff1a;电脑怎么设置定时关机&#xff1f;其实Windows系统设置关机很简单&#xff0c;主要有下面两个方法&#xff01; 演示机型&#xff1a;…

【学习打卡 Free-Excel 】Task1~2 数据源何而来_数据格式

free-excel 文章目录free-excel1 数据基本知识工作簿与工作表xls和xlsx单元格行列导入数据从文件导入数据从网页导入数据&#xff1a;中文编码&#xff1a;2 表格单元格数据类型excel错误提示数据统一添加符号数值转文本、文本转数值资源链接 Free excel_文字版Free excel&…