当前位置: 首页 > news >正文

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

请添加图片描述

文章目录

  • 🚀前言
  • 🚀库函数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";`//末尾有\0char c[] = { 'a','b','c','d','e','f' };//末尾无\0printf("%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')//两字符串相等,同时指向字符串末尾的\0return 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语言中部分字符函数的分享就结束了,希望这篇博客能让大家有所收获, 如果觉得阿辉写得不错的话,记得给个赞呗,铁子们的支持是我创作的最大动力🌹
请添加图片描述

相关文章:

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

文章目录 &#x1f680;前言&#x1f680;库函数strlen✈️strlen的模拟实现 &#x1f680;库函数strcpy✈️strcpy的模拟实现 &#x1f680;strcmp✈️strcmp的模拟实现 &#x1f680;strstr✈️strstr的模拟实现 &#x1f680;strcat✈️strcat的模拟实现 &#x1f680;前言 …...

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

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

【微软技术栈】与其他.NET语言的互操作性 (C++/CLI)

本文内容 使用 C# 索引器实现 C# 的 is 和 as 关键字实现 C# 的 lock 关键字 本节中的主题介绍如何在 Visual C 中创建程序集&#xff0c;这些程序集使用或提供以 C# 或 Visual Basic 编写的程序集的功能。 1、使用 C# 索引器 Visual C 不包含索引器&#xff1b;它具有索引…...

TCPUDP使用场景讨论

将链路从TCP改为UDP会对通信链路产生以下影响和注意事项&#xff1a; 可靠性&#xff1a;UDP是无连接的协议&#xff0c;与TCP相比&#xff0c;它不提供可靠性保证和重传机制。因此&#xff0c;当将链路从TCP改为UDP时&#xff0c;通信的可靠性会降低。如果在通信过程中丢失了U…...

C#最小二乘法线性回归

文章目录 SimpleRegressionMultipleRegression MathNet系列&#xff1a;矩阵生成 \quad 矩阵计算 LinearRegression是MathNet的线性回归模块&#xff0c;主要包括SimpleRegression和MultipleRegression这两个静态类&#xff0c;前者提供了最小二乘法的线性拟合&#xff0c;后…...

ULAM公链第九十六期工作总结

迈入12月&#xff0c;接下来就是雪花&#xff0c;圣诞&#xff0c;新年和更好的我们&#xff01;愿生活不拥挤&#xff0c;笑容不必刻意&#xff0c;愿一切美好如期而至&#xff01; 2023年11月01日—2023年12月01日关于ULAM这期工作汇报&#xff0c;我们通过技术板块&#xff…...

基于Echarts的大数据可视化模板:智慧交通管理

目录 引言智慧交通管理的重要性ECharts在智慧交通中的作用智慧交通管理系统架构系统总体架构数据收集与处理Echarts与大数据可视化Echarts库以及其在大数据可视化领域的应用优势开发过程和所选设计方案模板如何满足管理的特定需求模板功能与特性深入解析模板提供的各项功能模板…...

C#-快速剖析文件和流,并使用

目录 一、概述 二、文件系统 1、检查驱动器信息 2、Path 3、文件和文件夹 三、流 1、FileStream 2、StreamWriter与StreamReader 3、BinaryWriter与BinaryReader 一、概述 文件&#xff0c;具有永久存储及特定顺序的字节组成的一个有序、具有名称的集合&#xff1b; …...

【Linux】如何在Ubuntu 20.04上安装PostgreSQL

介绍 PostgreSQL或Postgres是一个关系数据库管理系统&#xff0c;提供SQL查询语言的实现。它符合标准&#xff0c;具有许多高级功能&#xff0c;如可靠的事务和无读锁的并发性。 本指南演示了如何在Ubuntu 20.04服务器上快速启动和运行Postgres&#xff0c;从安装PostgreSQL到…...

IT程序员面试题目汇总及答案-计算机面试

程序员面试题目汇总及答案-计算机面试 问题1:请你描述一下你在过去的工作中遇到的一个技术难题,你是如何解决的? 答案1:在我之前的工作中,我遇到了一个涉及大数据处理的问题。由于数据量巨大,传统的处理方法无法在规定的时间内完成。我最后采用了一种分布式计算的方法,…...

【Flink on k8s】- 5 - 简要介绍 Flink

目录 1、了解流计算框架 1.1 分代 1.2 流计算框架对比 2、Flink 的应用场景 2.1 Data anal...

物联网安全芯片ACL16 采用 32 位内核,片内集成多种安全密码模块 且低成本、低功耗

ACL16 芯片是研制的一款32 位的安全芯片&#xff0c;专门面向低成本、低功耗的应用领域&#xff0c; 特别针对各类 USB KEY 和安全 SE 等市场提供完善而有竞争力的解决方案。芯片采用 32 位内核&#xff0c;片内集成多种安全密码模块&#xff0c;包括SM1、 SM2、SM3、 SM4 算法…...

【Linux top命令】

文章目录 深入了解Linux top命令&#xff1a;实时监控系统性能1. 什么是top命令&#xff1f;2. 使用top命令3. top命令交互操作 深入了解Linux top命令&#xff1a;实时监控系统性能 1. 什么是top命令&#xff1f; top命令是一个用于实时监控系统性能的文本界面工具。它显示当…...

深入理解 Promise:前端异步编程的核心概念

深入理解 Promise&#xff1a;前端异步编程的核心概念 本文将帮助您深入理解 Promise&#xff0c;这是前端异步编程的核心概念。通过详细介绍 Promise 的工作原理、常见用法和实际示例&#xff0c;您将学会如何优雅地处理异步操作&#xff0c;并解决回调地狱问题。 异步编程和…...

Linux 和 macOS 的主要区别在哪几个方面呢?

(꒪ꇴ꒪ )&#xff0c;Hello我是祐言QAQ我的博客主页&#xff1a;C/C语言&#xff0c;数据结构&#xff0c;Linux基础&#xff0c;ARM开发板&#xff0c;网络编程等领域UP&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff0c;让我们成为一个强大的攻城狮&#xff0…...

springboot(ssm寝室小卖部系统 宿舍小商店网站Java(codeLW)

springboot(ssm寝室小卖部系统 宿舍小商店网站Java(code&LW) 开发语言&#xff1a;Java 框架&#xff1a;ssm/springboot vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1a;mysql 5.7&#xff08;或8.0&#x…...

什么是web组态?一文读懂web组态

随着工业4.0的到来&#xff0c;物联网、大数据、人工智能等技术的融合应用&#xff0c;使得工业领域正在经历一场深刻的变革。在这个过程中&#xff0c;web组态技术以其独特的优势&#xff0c;正在逐渐受到越来越多企业的关注和认可。那么&#xff0c;什么是web组态&#xff1f…...

华为OD机试真题-智能成绩表-2023年OD统一考试(C卷)

题目描述: 小明来到某学校当老师,需要将学生按考试总分或单科分数进行排名,你能帮帮他吗? 输入描述: 第1行输入两个整数,学生人数n和科目数量m。0<n<100,0<m<10 第2行输入m个科目名称,彼此之间用空格隔开。科目名称只由英文字母构成,单个长度不超过10个字符…...

YOLOv5独家原创改进:SPPF自研创新 | 可变形大核注意力(D-LKA Attention),大卷积核提升不同特征感受野的注意力机制

💡💡💡本文自研创新改进: 可变形大核注意力(D-LKA Attention)高效结合SPPF进行二次创新,大卷积核提升不同特征感受野的注意力机制。 收录 YOLOv5原创自研 https://blog.csdn.net/m0_63774211/category_12511931.html 💡💡💡全网独家首发创新(原创),适合p…...

算法:进制之前的转换

1. X进制转换成十进制-V1&#xff1a; /*** 笨办法&#xff0c;从左往右开始* Tips&#xff1a;只支持正数** param num* param radix* return*/private static Integer xToTenV1(String num, Integer radix) {if (num.length() 0 || num.charAt(0) -) {throw new IllegalArg…...

Keepass2Android密码库完整性验证终极指南:如何确保你的密码安全无虞

Keepass2Android密码库完整性验证终极指南&#xff1a;如何确保你的密码安全无虞 【免费下载链接】keepass2android Password manager app for Android 项目地址: https://gitcode.com/gh_mirrors/ke/keepass2android 在当今数字化时代&#xff0c;密码管理器已成为保护…...

nanobot应用场景:用Qwen3-4B构建Linux运维助手,自动解析nvidia-smi输出

nanobot应用场景&#xff1a;用Qwen3-4B构建Linux运维助手&#xff0c;自动解析nvidia-smi输出 1. 项目介绍&#xff1a;超轻量级AI运维助手 nanobot是一款受OpenClaw启发的超轻量级个人人工智能助手&#xff0c;专门为Linux运维场景设计。这个工具最大的特点是轻量高效&…...

Qt6.10.1 + QCustomPlot 2.1.1 串口绘图实战:从Qt5老项目迁移到新版本的完整踩坑记录

Qt6.10.1与QCustomPlot 2.1.1串口绘图项目迁移实战指南 当Qt5项目需要升级到Qt6时&#xff0c;许多开发者都会面临兼容性挑战。特别是那些涉及串口通信和数据可视化的项目&#xff0c;往往隐藏着不少"坑"。本文将带你完整走一遍从Qt5老项目迁移到Qt6.10.1的全过程&am…...

剑指offer-74、n个骰⼦的点数

在技术领域&#xff0c;我们常常被那些闪耀的、可见的成果所吸引。今天&#xff0c;这个焦点无疑是大语言模型技术。它们的流畅对话、惊人的创造力&#xff0c;让我们得以一窥未来的轮廓。然而&#xff0c;作为在企业一线构建、部署和维护复杂系统的实践者&#xff0c;我们深知…...

如何在ComfyUI中智能合成视频序列:VHS_VideoCombine节点的专业应用方案

如何在ComfyUI中智能合成视频序列&#xff1a;VHS_VideoCombine节点的专业应用方案 【免费下载链接】ComfyUI-VideoHelperSuite Nodes related to video workflows 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-VideoHelperSuite 面对AI生成的大量图像序列&…...

自动驾驶小白必看:航向角、偏航角、前轮转角到底有什么区别?

自动驾驶入门&#xff1a;航向角、偏航角与前轮转角的本质差异与应用解析 刚接触自动驾驶技术时&#xff0c;最让人困惑的莫过于那些描述车辆方向的专业术语——航向角、偏航角、前轮转角&#xff0c;它们看起来相似却又各有所指。理解这些概念不仅是掌握车辆控制的基础&#…...

基于卷积神经网络的忍者像素绘卷风格迁移:从原理到实战部署

基于卷积神经网络的忍者像素绘卷风格迁移&#xff1a;从原理到实战部署 1. 引言&#xff1a;当AI遇见像素艺术 想象一下&#xff0c;你手头有一张普通的照片&#xff0c;但希望它能变成复古游戏里的忍者像素风格——就像那些经典的街机游戏画面。这听起来像是需要专业美术师才…...

FPGA实战:手把手教你用Verilog给NAND Flash数据上把“安全锁”(附完整ECC代码)

FPGA实战&#xff1a;用Verilog为NAND Flash打造硬件级ECC防护系统 1. 为什么你的NAND Flash需要硬件ECC&#xff1f; NAND Flash存储芯片在工业控制、物联网终端和边缘计算设备中扮演着关键角色&#xff0c;但它的物理特性导致数据可靠性存在先天缺陷。想象一下&#xff0c;当…...

别只盯着时钟了!用Vivado的Set_Data_Check搞定FPGA里两个数据信号的时序检查(附工程源码)

FPGA时序约束进阶&#xff1a;用Set_Data_Check精准控制数据信号时序关系 在FPGA设计中&#xff0c;时序约束是确保电路功能正确性的关键环节。大多数工程师对时钟与数据信号之间的setup/hold约束已经驾轻就熟&#xff0c;但当面对两个数据信号之间的时序关系时&#xff0c;却常…...

重构PDF知识管理:Obsidian PDF++让文献处理效率提升300%的实战指南

重构PDF知识管理&#xff1a;Obsidian PDF让文献处理效率提升300%的实战指南 【免费下载链接】obsidian-pdf-plus PDF: the most Obsidian-native PDF annotation & viewing tool ever. Comes with optional Vim keybindings. 项目地址: https://gitcode.com/gh_mirrors/…...