字符串函数`strlen`、`strcpy`、`strcmp`、`strstr`、`strcat`的使用以及模拟实现

news2024/11/24 5:06:57

请添加图片描述

文章目录

  • 🚀前言
  • 🚀库函数strlen
    • ✈️strlen的模拟实现
  • 🚀库函数strcpy
    • ✈️strcpy的模拟实现
  • 🚀strcmp
    • ✈️strcmp的模拟实现
  • 🚀strstr
    • ✈️strstr的模拟实现
  • 🚀strcat
    • ✈️strcat的模拟实现

🚀前言

今天阿辉将为大家介绍字符串库函数strlenstrcpystrcmpstrstrstrcat的使用以及模拟实现,关注阿辉不迷路哦 😘 ,内容干货满满😋,接下来就跟着阿辉一起学习吧👊

🚀库函数strlen

库函数strlen是专门求字符串长度的库函数,strlen只能求字符串长度且要求字符串末尾须有\0,返回值长度不包括\0
strlen的函数声明

size_t strlen(const char* src);
返回值为size_t类型
接受一个字符串的首元素地址,即可返回字符串长度

例子:

#include<stdio.h>
#include<string.h>

int main()
{
	char* a = "abcdef";`//末尾有\0
	char c[] = { 'a','b','c','d','e','f' };//末尾无\0
	printf("%zd\n", strlen(a));
	printf("%zd\n", strlen(c));
	return 0;
}

输出:
在这里插入图片描述
上图我们可以看到一个输出6而一个却是42,就是因为常量字符串a末尾有\0而字符串数组c末尾无\0,而库函数strlen计算的长度是从字符串首元素到\0之间的元素个数,若字符串末尾无\0strlen则会一直向后找到\0位置然后返回。在C语言中\0堪称字符串的灵魂,后面几个函数会让大家有更深的体会。

✈️strlen的模拟实现

铁子们,咱们直接代码以及详解奉上👇

size_t my_strlen(const char* src)
{
	assert(src != NULL);//断言判断传入指针不为空
	size_t ret = 0;//记录字符串长度,作为返回值
	while (*src++)//这句代码下面单独解释
	{
		ret++;
	}
	return ret;
}

关于while(*src++)这句代码,因为后置++的优先级更高所以src++,但是又因为后置++实现使用后++,所以*src++这个表达式的值是*src然后src再加1,然后当指针src偏移到\0位置时while循环就停止了因为\0的本质就是0

🚀库函数strcpy

库函数strcpy是用来用来拷贝字符串的
strcpy的函数声明:

char* strcpy(char* dest, const char* src);
把从src地址开始到\0的字符串复制到以dest开始的地址空间
返回值为拷贝位置起始地址

注意:

  • 将源指向的 C 字符串复制到目标指向的数组中,包括终止空字符(并在该点停止)
  • 源字符串必须以 ‘\0’ 结束。
  • 会将源字符串中的 ‘\0’ 拷贝到目标空间。
  • 目标空间必须足够大,以确保能存放源字符串。
  • 目标空间必须可变

例子:

int main()
{
	char a[] = "abcd";
	char b[10] = { 0 };
	strcpy(b, a);
	printf("%s",b);
	return 0;
}

输出:

abcd

✈️strcpy的模拟实现

char* my_strcpy(char* dest, const char* src)
{
	char* ret = dest;//记下目标位置起始地址
	assert(dest && src);//断言判断传入的指针不为空
	while (*dest++ = *src++)
	{
		;
	}
	return ret;//返回目标位置起始地址
}

*dest++ = *src++这段代码可以理解为先进行*dest = *src ,然后dest = dest + 1; src = src + 1,当src指向\0时,\0赋给*dest然后跳出循环

🚀strcmp

库函数strcmp的函数声明:

int strcmp(const char* str1, const char* str2);

strcmp是用来比较字符串大小的函数,但并非是以字符串长度比较的,而是从两个字符串的起始位置开始,一一对应地进行比较,如果它们彼此相等,则继续以下对,直到字符不同或达到\0,字符不同时比较的是ASII值大小
返回值:

  • 第一个字符串大于第二个字符串,则返回大于0的数字
  • 第一个字符串等于第二个字符串,则返回0
  • 第一个字符串小于第二个字符串,则返回小于0的数字

例子:

int main()
{
	char a[] = "adc";
	char b[] = "abcd";
	int ret = strcmp(a, b);
	printf("%d ", ret);
	return 0;
}

输出:

1

请添加图片描述

✈️strcmp的模拟实现

int my_strcmp(const char* str1, const char* str2)
{
	assert(str1 && str2);
	while (*str1 == *str2)
	{
		if (*str1 == '\0')//两字符串相等,同时指向字符串末尾的\0
			return 0;
		str1++;
		str2++;
	}
	return *str1 - *str2;//不等位置相减
}

🚀strstr

库函数strstr的函数声明:

char* strstr(const char* str1, const char* str2);

strstr函数是用来判断主串str1中是否存在子串str2,如果存在则返回str1中第一次出现子串的起始位置地址,否则返回NULL
阿辉作图给大家展示一下:
请添加图片描述

int main()
{
	char a[] = "abcdsfejsl";
	char b[] = "dsfe";
	printf("%s", strstr(a, b));
	return 0;
}

输出:

dsfejsl

因为返回的是主串中子串起始位置地址,上述代码中也就是d位置的地址,用%s打印就是dsfejsl这一段

✈️strstr的模拟实现

char* my_strstr(const char* dest, const char* src)
{
	assert(dest && src);//断言判断不为空
	char* ret = dest;//ret作返回值,记录主串下一个起始比对位置
	char* p = src;//记录子串的起始位置
	if (*src == '\0')//子串为空直接返回主串
	{
		return ret;
	}
	while (*dest)//遍历到主串\0位置跳出循环
	{
		//从主串起始比对位置与子串一一比对
		while (*dest++ == *src++)//不相等时跳出循环
		{
			if (*dest == '\0')//当主串遍历到\0位置还进来,说明子串也到末尾\0位置了,直接返回主串起始比对位置
			{
				return ret;
			}
		}
		if (*src == '\0')//跳出循环时,src已到\0位置说明主串中找到子串,返回主串起始比对位置
		{
			return ret;
		}
		dest = ++ret;//上述if都没进去说明该主串起始比对位置找不到子串,++ret记录下一个起始比对位置,并把值赋给dest,从下一个起始比对位置开始遍历
		src = p;//src返回子串起始位置
	}
	return NULL;//上述都为返回说明找不到,返回空
}

铁子们不懂的话,下面这幅图还有解释:
请添加图片描述

🚀strcat

库函数strcat的函数声明:

char* strcat(char* dest, const char* src);

strcat库函数是用来把src所指向的字符串(包括\0)复制到dest所指向的字符串后面(删除*dest原来末尾的\0)。要保证*dest足够长,以容纳被复制进来的*src*src中原有的字符不变。返回指向dest的指针
例子:

int main()
{
	char a[20] = "abc";
	char b[] = "dsfe";
	printf("%s\n", strcat(a, b));
	return 0;
}

输出:

abcdsfe

✈️strcat的模拟实现

char* my_strcat(char* dest, const char* src)
{
	assert(dest && src);//断言判断不为空
	char* ret = dest;//记录起始地址作为返回值
	while (*dest)//找到目标字符串\0位置
	{
		dest++;
	}
	while (*dest++ = *src++)
	{
		;
	}
	return ret;
}

while (*dest++ = *src++)这段代码前面大家见得多了,实在不理解可以自己敲出来试试,这里阿辉复制粘贴一下😘
*dest++ = *src++这段代码可以理解为先进行*dest = *src ,然后dest = dest + 1; src = src + 1,当src指向\0时,\0赋给*dest然后跳出循环


到这里,阿辉今天对于C语言中部分字符函数的分享就结束了,希望这篇博客能让大家有所收获, 如果觉得阿辉写得不错的话,记得给个赞呗,铁子们的支持是我创作的最大动力🌹
请添加图片描述

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

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

相关文章

OpenCV基础篇

OpenCV基础篇 一、图像、视频读取二、cv::Mat()数据类型三、绘图功能四、鼠标响应事件五、图像像素读写六、图像像素运算七、颜色空间转换八、图像几何变换九、图像滤波十、图像二值化十一、图像梯度十二、Canny边缘检测十三、图像形态学十四、图像直方图十五、霍夫变换十六、分…

jsp使用 分页专用工具

分页器&#xff0c;根据过来的参数计算当着页应当从哪一条记录开始显示&#xff0c;并且显示到哪。 PageUtils [pageSize5, currIndex1, totalCount166, totalPage34, startPosition0] PageUtils [pageSize5, currIndex5, totalCount166, totalPage34, startPosition20] PageUt…

MongoDB的删除文档、查询文档语句

本文主要介绍MongoDB的删除文档、查询文档命令语句。 目录 MongoDB删除文档MongoDB查询文档 MongoDB删除文档 MongoDB是一种基于文档的NoSQL数据库&#xff0c;它使用BSON格式存储文档。删除文档是MongoDB数据库中的常见操作之一。 下面是MongoDB删除文档的详细介绍和示例&am…

vscode创建python虚拟环境

一、创建虚拟环境 python -m venv vsvenv 二、激活虚拟环境 cd .\myvenv\Scripts.\Activate.ps1 如果出现下图所示&#xff1a; 1、使用管理员运行PowerShell 2、输入命令&#xff1a;Get-ExecutionPolicy 3、输入命令&#xff1a;Set-ExecutionPolicy RemoteSigned&…

react-photo-view 的介绍、安装、使用。

目录 基本介绍 安装 使用 基本介绍 react-photo-view 是一个基于 React 的图片查看器组件&#xff0c;用于在网页上展示和浏览图片。该组件提供了用户友好的界面和交互&#xff0c;可以轻松地在应用程序中集成并使用。 支持触摸手势&#xff0c;拖动/平移/物理效果滑动…

【数据结构第 6 章 ① 】- 图的定义和基本术语

目录 一、图的定义 二、图的基本术语 图是一种比线性表和树更为复杂的数据结构。在线性表中&#xff0c;数据元素之间仅有线性关系&#xff0c;每个数据元素只有一个直接前驱和一个直接后继&#xff1b;在树形结构中&#xff0c;数据元素之间有着明显的层次关系&#xff0c;并…

学生备考使用台灯到底好不好?公认好用的护眼台灯推荐

在现代生活中&#xff0c;许多学生的学习压力越来越大&#xff0c;面临的近视几率也越来越大&#xff0c;特别是初中生&#xff0c;眼睛发育还未完全&#xff0c;使用不恰当的灯光也会对眼睛造成损害&#xff0c;特别是护眼台灯。虽然护眼台灯在功能上能够提供充足、柔和的光线…

网络互连与常用设备

网络互连是为了将两个以上具有独立自治能力、同构或异构的计算机网络连接起来&#xff0c;实现数据流通&#xff0c;扩大资源共享的范围&#xff0c;或者容纳更多的用户。网络互连包括局域网与局域网的互连、局域网与广域网的互连、广域网与广域网的互连&#xff0c;这可以扩大…

线性回归算法-实战-房价预测

线性回归算法-实战-房价预测 本次使用线性回归的算法和knn算法进行对比 加载并处理数据对数据进行归一化处理数据拆分knn模型对象创建和训练线性回归建模和训练 加载并且处理数据 import numpy as np import pandas as pd from sklearn.neighbors import KNeighborsRegresso…

kennard-stone算法实现样本集划分(ks算法)

目录 一、 Kennard-Stone算法原理&#xff08;KS算法&#xff09; 二、Kennard-Stone算法作用 三、代码 四、对选出来的train样本使用T-SNE算法进行绘制 五、参考链接 一、 Kennard-Stone算法原理&#xff08;KS算法&#xff09; KS算法原理&#xff1a;把所有的样本都看…

UE4 .ini文件使用

在需要给配置文件的类中加上config标签&#xff0c;当然变量也要加 在项目的Config下&#xff0c;新建一个Default类的UCLASS中config等于的名字&#xff0c;这里结合上面截图就是DefaultTest 在下面写入 [/Script/项目名/类名] 然后写变量以及对应的值即可

机器学习-SVM(支持向量机)

推荐课程&#xff1a;【机器学习实战】第5期 支持向量机 |数据分析|机器学习|算法|菊安酱_哔哩哔哩_bilibili 赞美菊神ヾ ( ゜ⅴ゜)&#xff89; 一、什么是支持向量机&#xff1f; 支持向量机&#xff08;Support Vector Machine, SVM&#xff09;是一类按监督学习&#xff0…

python学习——对大疆御3E拍摄照片赋予坐标系并旋转

对大疆御3E拍摄照片赋予坐标系并旋转 问题描述 进行植被覆盖度验证时&#xff0c;需采集验证点的植被覆盖情况&#xff0c;但无人机拍摄的照片缺少坐标系&#xff0c;无法进行对比验证。 解决方案 赋予照片坐标系 在gdal中对影像赋予坐标系主要参数为仿射六参数&#xff1…

深度解析TCP协议:特点、应用场景及市面上常见软件案例

目录 引言 TCP的特点 TCP的应用场景 市面上使用TCP的软件案例 引言 TCP&#xff08;Transmission Control Protocol&#xff09;是计算机网络中一种基于连接的、可靠的传输层协议。它具有一系列独特的特点&#xff0c;适用于广泛的应用场景。本文将深入研究TCP的特点、应用…

VSCode SSH登录服务器 提示XHR failed

设置->搜索“代理” 把图中的√去掉 重启 即可

全面覆盖,无所不包:C++ 编程必备指南 | 开源日报 No.99

fffaraz/awesome-cpp Stars: 51.0k License: MIT 这个项目是一个精心策划的 C(或者 C) 框架、库、资源和其他有趣东西的列表。它收集了各种标准库&#xff0c;如 STL 容器和算法&#xff1b;不同领域的框架&#xff0c;比如人工智能、异步事件循环等&#xff1b;以及一系列功…

【Linux】cat 命令使用

cat 命令 cat&#xff08;英文全拼&#xff1a;concatenate&#xff09;命令用于连接文件并打印到标准输出设备上。 可以使用cat连接多个文件、创建新文件、将内容附加到现有文件、查看文件内容以及重定向终端或文件中的输出。 cat可用于在不同选项的帮助下格式化文件的输出…

应用商店ASO优化提升APP排名的6大策略

ASO优化基操你了解多少&#xff1f; ASO优化对于APP推广运营来说是必不可少的一个方法。在当今竞争激烈的应用程序市场中&#xff0c;ASO&#xff08;App Store Optimization&#xff09;优化已成为提升APP排名和曝光度的关键因素。 一、ASO优化的重要性 ASO优化有助于提高AP…

如何为 3D 模型制作纹理的最佳方法

在线工具推荐&#xff1a; 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 您可以通过不同的方式为 3D 模型创建 3D 纹理。下面我们将介绍为 3D …

UML图的各种类型以及软件设计师考试考察的方式

UML建模 前言 常见的UML的类型 UML 比前两题是更难的&#xff08;略高&#xff0c;但是学会就可以了。前两题是&#xff1a;数据流图&#xff0c;数据库的设计&#xff09;&#xff0c;因为UML图有很多类型&#xff1a;用例图&#xff0c;类图与对象图&#xff0c;顺序图&…