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

请添加图片描述

文章目录

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

🚀前言

今天阿辉将为大家介绍字符串库函数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

✈️strstr的模拟实现

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

模型能力赋能搜索——零样本分类(Zero-Shot Classification)在搜索意图识别上的探索

什么是Zero-Shot Classification https://huggingface.co/tasks/zero-shot-classification hugging face上的零样本分类模型 facebook/bart-large-mnli https://huggingface.co/facebook/bart-large-mnli 当然这是一个英文模型&#xff0c;我们要去用一些多语言的模型。 可以在…

单片机双机通信控制跑马灯

实验要求 两个单片机各驱动8个LED灯&#xff0c;构成两个跑马灯&#xff0c;要求甲单片机LED的点亮方式是从上至下&#xff0c;首先是最上面第一个点亮、其次是前两个点亮、其次是前三个点亮……直至8个灯全部点亮&#xff0c;8个灯全部灭&#xff0c;重复这个过程&#xff0c…

MTU与MSS

MTU&#xff1a;一个网络包的最大长度&#xff0c;以太网中一般为1500各字节。 MSS&#xff1a;除去头部之后&#xff0c;一个网络包所能容纳的TCP数据的最大长度。 应用程序调用write后&#xff0c;将要发送的数据被交给TCP/IP协议栈进行。 协议栈不关心应用的数据内容&…

使用Microsoft Dynamics AX 2012 - 5. 生产控制

生产控制的主要职责是生产成品。为了完成这项任务&#xff0c;制造业需要消耗物品和资源能力&#xff08;人员和机械&#xff09;。制造过程可能包括半成品的生产和库存。半成品是指物品包括在成品材料清单中。 制造业的业务流程 根据公司的要求&#xff0c;您可以选择申请Dy…

三星有一个特有的重置电脑的应用程序,方便快捷,那就是三星恢复

本文介绍如何将三星笔记本电脑重置为出厂设置。它涵盖了两种方法,它们都适用于Windows 11和Windows 10。 如何用“三星恢复(Samsung Recovery)”重置三星笔记本电脑 许多三星笔记本电脑附带一种名为“三星恢复”的实用程序。这是一个比Windows“重置此电脑”过程更快、更不…

枚举 LeetCode2048. 下一个更大的数值平衡数

如果整数 x 满足&#xff1a;对于每个数位 d &#xff0c;这个数位 恰好 在 x 中出现 d 次。那么整数 x 就是一个 数值平衡数 。 给你一个整数 n &#xff0c;请你返回 严格大于 n 的 最小数值平衡数 。 如果n的位数是k&#xff0c;n它的下一个大的平衡数一定不会超过 k1个k1…

插入排序与希尔排序(C语言实现)

1.插入排序 由上面的动图可以知道插入排序的逻辑就是从第一个元素开始往后遍历&#xff0c;如果找到比前一个元素小的&#xff08;或者大的&#xff09;就往前排&#xff0c;所以插入排序的每一次遍历都会保证前面的数据是有序的&#xff0c;接下类用代码进行讲解。 我们这里传…

圆通速递查询,圆通速递单号查询,用表格导出查询好的物流信息

批量查询圆通速递单号的物流信息&#xff0c;以表格的形式导出查询好的物流信息。 所需工具&#xff1a; 一个【快递批量查询高手】软件 圆通速递单号若干 操作步骤&#xff1a; 步骤1&#xff1a;运行【快递批量查询高手】软件&#xff0c;并登录 步骤2&#xff1a;点击主界…

SVN版本回退

文章目录 SVN版本回退 SVN版本回退 一、revert to this version和revert to this version的区别&#xff1a; 基于4674版本执行"revert to this version"操作效果&#xff1a; 基于4674版本执行"revert changes from this version"操作效果&#xff1…

【为什么设置了宏,在宏名称列表里面却没有?】

为什么设置了宏,在宏名称列表里面却没有? 参考这篇文档&#xff1a; 宏没有出现在宏列表中

【rabbitMQ】rabbitMQ的下载,安装与配置

目录 1. 下载Erland 安装步骤&#xff1a; 配置环境变量&#xff1a; 校验环境变量配置是否成功 2.下载MQ 安装步骤&#xff1a; 添加可视化插件 &#xff1a; 启动&#xff1a; 拒绝访问 1. 下载Erland 因为rabbitMQ是基于Erland,所以在安装rabbitMQ之前需要安装Erla…

用Java实现一对一聊天

目录 服务端 客户端 服务端 package 一对一用户; import java.awt.BorderLayout; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; imp…

Kubernetes(K8s 1.27.x) 快速上手+实践,无废话纯享版

文章目录 1 基础知识1.1 K8s 有用么&#xff1f;1.2 K8s 是什么&#xff1f;1.3 k8s 部署方式1.4 k8s 环境解析 2 环境部署2.1 基础环境配置2.2 容器环境操作2.3 cri环境操作2.4 harbor仓库操作2.5 k8s集群初始化2.6 k8s环境收尾操作 3 应用部署3.1 应用管理解读3.2 应用部署实…

C++初阶-string类的模拟实现

string类的模拟实现 一、经典的string类问题1.1 构造函数1.1.1 全缺省的构造函数 2.1 拷贝构造3.1 赋值4.1 析构函数5.1 c_str6.1 operator[]7.1 size8.1 capacity9.1 比较&#xff08;ASCII&#xff09;大小10.1 resize11.1 reserve12.1 push_back(尾插字符)13.1 append(尾插字…

视频剪辑方法:视频随机分割,高效批处理剪辑实战

随着数字媒体技术的不断发展&#xff0c;视频剪辑已经成为影视制作、广告投放、教育视频制作等领域中不可或缺的一部分。为了提高剪辑效率和质量&#xff0c;采用视频随机分割的方法&#xff0c;能够实现对视频的批量处理&#xff0c;进而提高剪辑的效率和质量。视频随机分割是…

【上海大学数字逻辑实验报告】五、记忆元件测试

一、实验目的 掌握R-S触发器、D触发器和JK触发器的工作原理及其相互转换。学会用74LS00芯片构成钟控RS触发器。学会用74LS112实现D触发器学会在Quartus II上用D触发器实现JK触发器。 二、实验原理 基本R-S触发器是直接复位-置位的触发器&#xff0c;它是构成各种功能的触发器…

云LIS实验室信息管理系统源码——实验室信息管理解决方案

云LIS&#xff08;Cloud Laboratory Information System&#xff09;是一种为区域医疗提供临床实验室信息服务的计算机应用程序&#xff0c;其主要功能是协助区域内所有临床实验室相互协调并完成日常检验工作&#xff0c;对区域内的检验数据进行集中管理和共享&#xff0c;通过…

根据图片生成前端代码:GPT vesion 助你释放效能 | 开源日报 No.98

php/php-src Stars: 36.4k License: NOASSERTION PHP 是一种流行的通用脚本语言&#xff0c;特别适合 Web 开发。快速、灵活和实用&#xff0c;PHP 支持从博客到世界上最受欢迎的网站等各种应用。PHP 遵循 PHP 许可证 v3.01 发布。 主要功能&#xff1a; 提供强大而灵活的脚…

RK3566 MPPJPEG 编码初入门 mpi_enc_test

一、导览 本文介绍了使用rk mpp 库的demo 程序&#xff0c;对一帧 nv12的yuv 图像进行jpeg 编码&#xff0c;最后输出jpeg图像的过程。作为学习mpp 入门的教程。 rk mpp 的源码仓库地址是&#xff1a;https://github.com/rockchip-linux/mpp/ 参考文档在&#xff1a;https://g…

UE4.27-UE5.1设置打包Android环境

打包Android配置文件 1. 配置打包Android的SDK需求文件位于下面文件中&#xff1a; 2. 指定了对应的SDK环境变量名字以及NDK需求等&#xff1a; UE4.27-UE5.1--脚本自动配置 安装前提 1. 务必关闭虚幻编辑器和Epic Games Launcher&#xff0c;以确保NDK组件的安装或引擎环境…