【C语言】常见的字符串函数

news2024/10/6 8:39:02

©作者:末央&

©系列:C语言初阶(适合小白入门)
©说明:以凡人之笔墨,书写未来之大梦

在这里插入图片描述

目录

  • strlen函数
    • 模拟实现
  • strstr子串查找函数
    • 模拟实现
  • strtok字符串分割

strlen函数

strlen函数是一个用于求字符串长度的库函数。它的参数是被求长度的字符串的起始地址,返回值是一个无符号整型。

注意:

1.参数指向的字符串要以’\0’结束。
2.trlen返回的是在字符串中’\0’之前出现的字符个数(不包含’\0’)。
3.注意函数的返回值为size_t,是无符号的(易错)。

模拟实现

方式一:计数器的方式
我们定义一个变量为count,如果传入的指针指向的内容不是’\0’,那么count++,同时指针后移一位,循环往复,直到找到’\0’时返回count即可。

size_t my_strlen1(const char* str)
{
	size_t count = 0;//计数器
	while (*str)
	{
		count++;
		str++;
	}
	return count;
}

方式二:递归的方式
我们一进入函数体就判断传入指针指向的内容是否为’\0’,如果是就返回0,不是就返回1+my_strlen2(str+1),如此进行下去,直到递归到内层时找到’\0’,这时再一步步将值返回回来即可。

size_t my_strlen2(const char* str)
{
	if (*str == '\0')
		return 0;
	else
		return 1 + my_strlen2(str + 1);
}

方式三:指针-指针的方式
进入函数体时,我们事先定义一个指针变量将传入的指针保存下来,然后将传入的指针向后移,直到遇到’\0’时,我们返回当前指针与保存的指针的差值即可。(指针与指针的差的绝对值是两个指针之间的元素个数)

size_t my_strlen3(const char* str)
{
	const char* p = str;//保存起始位置
	while (*str != '\0')
		str++;
	return str - p;
}

strstr子串查找函数

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

strstr函数可以在一个字符串(字符串1)中查找另一个字符串(字符串2),如果字符串2存在于该字符串1中,那么就返回被字符串2在字符串1中第一次出现的起始位置,如果在字符串1中找不到字符串2,那么就返回空指针(NULL)。它的第一个参数是字符串1的起始位置,第二个参数是字符串2的起始位置。
注意:

若字符串2为空字符串,则返回字符串1的起始位置。
举个例子,比如我们在字符串"abcdefbcd"中查找字符串"bcd"。

#include<stdio.h>
#include<string.h>
int main()
{
	char arr1[] = "abcdefbcd";
	char arr2[] = "bcd";
	char* ret = strstr(arr1, arr2);//在arr1中查找arr2字符串第一次出现的位置
	if (ret != NULL)
		printf("%s\n", ret);
	else
		printf("找不到\n");
	return 0;
}

注意:strstr函数的返回值是字符串"bcd"在字符串"abcdefbcd"中第一次出现的位置的起始位置,而不是出现几次就返回几个起始位置。

模拟实现

这里讲一下下面代码中各个指针的作用。

  • cur指针,主要记录每次主串开始匹配的位置,为了防止子串和主串第一次没有匹配成功,而方便多次匹配。如果这次没匹配成功,则cur++开始从下一个位置匹配。

  • -p1和sp指针: 通过判断s1和s2指针解引用后是否相等来判断每个字符是否匹配成功,若成功,则指针后移比较下一对字符;若失败,p1指针返回cp指针处,p2指针返回待查找字符串的起始位置

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<assert.h>
char* my_strstr(const char* str1, const char* str2)
{
	assert(str1 && str2);
	if (*str2 == '\0')		//空串
	{
		return str1;
	}
	const char* cur = str1;
	const char* p2 = str2;		//不改变字符加const
	const char* p1 = str1;
	while (*cur)
	{
		p1 = cur;
		p2 = str2;
		while (*p1 == *p2 && *p1 && *p2)		//这里判断p1是为了判断下一个字符是否为\0,节省循环次数
		{
			p1++;
			p2++;
		}
		if (*p2 == '\0')
		{
			return cur;
		}
		cur++;
	}
	return NULL;//不是子串
	
}
int main()
{
	char arr1[] = "abbbcdef";
	char arr2[] = "bbc";
	char* ret = my_strstr(arr1, arr2);
	if (ret == NULL)
	{
		printf("%s不是字串\n",arr2);
	}
	else
	{
		printf("%s\n", ret);
	}
	return 0;
}

在这里插入图片描述

strtok字符串分割

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

  • strtok函数能通过给定的一系列字符将一个字符串分割成许多子字符串的函数。它的第一个参数是需要被分割的字符串的首地址;第二个参数是一个字符串的首地址,该字符串是用作分隔符的字符集合。返回值是查找到的标记的首地址。

  • 注意:

    strtok函数找到strToken中的一个标记时,会将其用 \0结尾并返回这个标记的首地址。

  • strtok函数会改变strToken函数,所以在使用strtok函数切分的字符串都是临时拷贝的内容并且可修改。

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

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

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

#include<stdio.h>
#include<string.h>
int main()
{
	char arr1[] = "2957055542@qq.com";//待分割字符串
	char arr2[] = "@.";//分隔符的字符集合
	char arr3[20] = { 0 };
	strcpy(arr3, arr1);//将数据拷贝一份使用,防止原数据被修改
	char* token = strtok(arr3, arr2);//第一次传参需传入待分割字符串首地址
	while (token != NULL)//说明还未分割完
	{
		printf("%s\n", token);
		token = strtok(NULL, arr2);//对同一个字符串进行分割,第二次及以后的第一个参数为NULL
	}
	return 0;
}

注意:当strtok函数找到第一个标记时,将其后的’@‘字符改为’\0’并返回第一个标记的首地址,所以我们以返回的地址为首地址开始打印字符串的时候就只会打印出2957055542,第二次再对该字符串调用strtok函数时将从’@'字符后面开始寻找下一个标记。

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

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

相关文章

React+TS前台项目实战(二十三)-- 基于属性自定义数值显示组件Decimal封装

文章目录 前言Decimal组件1. 功能分析2. 代码详细注释3. 使用方式4. 效果展示 总结 前言 今天要封装的Decimal 组件&#xff0c;是通过传入的属性进行定制化显示数值&#xff0c;在渲染时&#xff0c;会根据不同的情况显示整数部分、小数部分和单位&#xff0c;支持自定义样式…

加速度数据 - 初始速度未知对速度积分的影响

这个问题不多说&#xff0c;只看一下速度积分的结果就可以知晓&#xff1a; 原本三角函数sin的积分是相移之后的自身&#xff0c;但是&#xff1a; 注意这一个概念&#xff1a; 原始信号如果引入一个未知的直流偏移。对该信号进行积分的结果&#xff0c;会将这个直流偏置转换…

Emacs之解决:java-mode占用C-c C-c问题(一百四十六)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

晨持绪科技:抖音网店现在能做起来吗

在这个信息爆炸的时代&#xff0c;抖音以其独特的魅力和庞大的用户基数&#xff0c;成为了众多创业者心中的黄金地带。然而&#xff0c;许多人在跃跃欲试的同时&#xff0c;也不禁会问&#xff1a;抖音网店现在还能做起来吗? 我们要认识到&#xff0c;抖音作为一个短视频平台&…

统计信号处理基础 习题解答11-1

题目 观测到的数据具有PDF 在μ给定的条件下&#xff0c;是相互独立的。均值具有先验PDF&#xff1a; 求μ的 MMSE 和 MAP 估计量。另外&#xff0c;当和时将发生什么情况? 解答 和两者都是独立高斯分布&#xff0c;与例题10.1一致&#xff0c;直接套用&#xff08;10.11&am…

单片机中有FLASH为啥还需要EEROM?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「单片机的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01; 一是EEPROM操作简单&…

第2章.现场设备的物联网模式--数字孪生

2.2 数字孪生 DT是部署在现场的物联网设备的虚拟复制品。这个概念与创建物理实体或过程的模型&#xff08;模拟&#xff09;以了解其表现行为的过程非常相似。本书中使用的DT符号如下图所示&#xff1a; 图2.3——DT模式的符号 DT是物联网背景下的一种重要模式&#xff0c;因为…

2024年Stable Diffusion下载+安装+使用教程(超详细版本)收藏这一篇就够了!

本篇咱们要聊的是如何用“整合包”来搞定StabIe Diffusion WebUI的本地安装和使用&#xff0c;别担心&#xff0c;你不需要成为计算机大神&#xff0c;新手也能轻松上手。不过得提醒一下&#xff0c;你的硬盘得留出100G~200G的空间来&#xff0c;才能玩得转。 整合包放这里&am…

无人机热成像分析图谱原理

一、热成像原理 热成像&#xff0c;也称为红外热成像或红外成像&#xff0c;是一种利用红外辐射&#xff08;通常指的是热辐射&#xff09;来获取物体表面温度分布信息的成像技术。在无人机上集成热成像传感器&#xff0c;可以远程捕获并分析目标物体的热特征&#xff0c;不受…

【OpenCV 图像处理 Python版】OpenCV 简介及安装

文章目录 1.OpenCV 介绍1.1 OpenCV 的特点1.2 OpenCV 的主要模块1.3 OpenCV 的应用场景 2.OpenCV-Python 库3.OpenCV 安装 1.OpenCV 介绍 OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉和机器学习软件库。它由英特尔公司于1999年…

[工业网络][4] 网络防御

防御 防御方案 层层防御的原则是依赖于多层次的重叠防护措施&#xff0c;以防止最严重的情况发生。如果一层措施失效&#xff0c;下一层措施将接管&#xff0c;依此类推。为了理解这个概念如何应用于工业网络安全&#xff0c;我们首先看看如何应用于一个常见的化工处理应用&a…

SQL语句的案例分析

根据提供的图片内容&#xff0c;这段文字看起来像是一个SQL查询的一部分&#xff0c;特别是一个用于删除数据的语句。以下是对这段SQL的核心内容整理&#xff1a; ### 核心内容整理&#xff1a; 1. **删除操作**&#xff1a; - 使用DELETE语句来删除数据。 2. **子查询**…

红酒与高尔夫:球场上的优雅之选

在绿茵茵的高尔夫球场上&#xff0c;每一个挥杆的瞬间都充满了优雅与力量。而当这种运动与红酒相遇&#xff0c;便是一场关于品味与格调的很好邂逅。今天&#xff0c;就让我们一起探讨红酒与高尔夫这对球场上的优雅之选&#xff0c;感受它们交织出的不同魅力。 一、高尔夫&…

《信创数据库沙龙上海站:共话发展,智启未来》

2024 年 6 月 29 日周六 14:00&#xff0c;信创数据库沙龙在上海市徐汇区建国西路 285 号科投大厦 13 楼金星厅成功举办。本次活动吸引了众多学术界和产业界的专家、学者以及技术爱好者参与。 活动中&#xff0c;多位嘉宾带来了精彩分享。薛晓刚探讨了 Oracle 在国内的前景&a…

最新全国河流断面水质监测日数据,shp/excel格式

基本信息. 数据名称: 全国河流断面水质监测日数据 数据格式: Shp、Excel 数据时间: 2023年 数据几何类型: 点 数据坐标系: WGS84坐标系 数据来源&#xff1a;网络公开数据 数据字段&#xff1a; 序号字段名称字段说明1province省名称2city城市名称3county区县名称…

量取无忧 —— PP容量瓶,实验室的透明选择

PP容量瓶&#xff0c;即聚丙烯&#xff08;Polypropylene&#xff0c;简称PP&#xff09;材质的容量瓶&#xff0c;是一种实验室常用的量器&#xff0c;用于准确量取一定体积的液体。以下是PP容量瓶的一些主要特性和应用&#xff1a; 主要特性&#xff1a; 1. 耐化学性&#x…

亚马逊等跨境电商测评怎么做?

由于政府的扶持&#xff0c;跨境电商面向全球市场的大蛋糕让国内创业者找到了新的方向&#xff0c;现在很多国内卖家都转型做跨境了&#xff0c;但较多卖家现在都是两眼摸黑&#xff0c;不懂怎么做&#xff0c;南哥这边给大家分享一下现在的大部分卖家都在做的——测评 什么是…

【论文阅读】XuanYuan: An AI-Native Database

XuanYuan: An AI-Native Database 这篇文章主要是讨论了AI4DB 和 DB4AI 集成的数据库架构&#xff0c;以此提出了AI原生的数据库&#xff0c;架构如下&#xff1a; 而具体发展阶段来说&#xff0c;AI原生数据库主要由五个阶段组成 第一阶段&#xff0c;AI建议型数据库&#xf…

乐鑫Wi-Fi单火线开关方案,传统开关智能升级,启明云端乐鑫一级代理商

随着智能家居技术的飞速发展&#xff0c;我们的日常生活正在变得越来越便捷。今天&#xff0c;我们要探讨的是一种创新的智能家居方案——Wi-Fi单火线智能开关。 传统的机械单火线开关虽然简单可靠&#xff0c;但在现代智能家居系统中显得力不从心。它们无法远程控制&#xff…

leetcode每日一练:链表OJ题

链表经典算法OJ题 1.1 移除链表元素 题目要求&#xff1a; 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,6,3,4,5,6], val 6 输出&a…