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

用c语言模拟实现常用字符串函数

目录

一.常用字符串函数介绍

1.strlen

2. strcpy

3.strcmp

4.strcat

5.strstr

二.模拟实现常用字符串函数

         1.strlen

2.strcpy

3.strcmp

4.strcat

5.strstr


一.常用字符串函数介绍

1.strlen

        字符串strlen是用来求字符串长度的,我们可以打开cpp网站查看有关信息

        该函数用来求字符串长度,求的是‘\0’之前字符的个数,函数参数为字符指针,因为该函数不需要修改字符串的值,故为了保护字符串被意外修改,设置为只读,所以在参数字符指针用const修饰,返回值即为字符串的长度,

        下面以经典helloworld字符串为例:

 输出结果:

字符串arr1为“helloworld”,一个10个字符,该字符串长度则为10,输出结果正确

2. strcpy

        字符串函数strcpy是用来拷贝字符串的,即将一个字符串的内容拷贝到另一个字符串中,而且会将该字符的'\0'也拷贝到另一个字符串中,我们打开cpp网站查看该函数的有关信息

         该函数的参数为两个字符指针,一个指向目标字符串,一个指向源字符串,由于只需要修改目标字符串,故用const修饰源字符串以防止误修改,函数返回值是目标字符串的首地址

下面以经典helloworld字符串为例:

  输出结果:

         可以看到我们将arr2中的helloworld成功地拷贝到了arr1中,但特别值得注意的是,当目标字符串空间不够时,强行拷贝比空间更大的字符串,虽然也可以输出结果,但毕竟是越界访问,会引发一些不可估计的问题,如将本例的arr1大小由10改为5:

 

 

可以看到程序运行后,虽然正常地打印出了结果,但是程序出错了

3.strcmp

        字符串函数strcmp函数是用来比较两个字符串大小的,但是并不是比较两个字符串的大小,而是比较字符串的内容,如果第一个字符串小于第二个字符串,则返回一个小于0的值,大于则返回一个大于0的值,等于则返回0,如“hello”和“hellz”,前面的字符都相等,‘o’小于‘z’,故"hello"小于“hellz”,如“hellx”和"hella",前面的字符都相等,'x'大于'a',所以“hellx”大于“hella”

        打开cpp网站查看该函数的相关信息

        该函数的参数为两个字符指针,由于比较不需要修改字符串,所以两个参数都用const修饰以防误修改 返回值为int型,比较的结果为小于则为小于0的值,大于则为大于0的值,等于则为0

下面以经典的helloworld字符串为例

输出结果:

 arr1小于arr2,故输出的结果为-1,arr3大于arr4,故输出的结果为1,arr5等于arr6,故输出的结果为0

4.strcat

        字符串函数strcat是用来连接两个字符串的,即将源字符串连接到目标字符串后面,连接的步骤是先找到目标字符串的末尾‘\0’,然后再进行拷贝,所以与strcpy的区别就在于要从目标字符串的末尾开始拷贝

        打开cpp网站查看该函数的相关信息:

         该函数的参数为两个字符指针,由于源字符串不需要修改,故加上const修饰以防误修改,返回值为连接后的字符串的地址,即目标字符串的地址

        下面以经典的helloworld字符串为例:

 输出结果

        可以看到我们成功地将arr2的“world”连接到arr1的“hello”中,于是arr1便变成了“helloworld”,与拷贝函数类似,特别值得注意的是,目标字符串要有足够大的空间,否则强行连接的话会出现一些未知的错误

        我们将上例的arr1的大小改为8:

 输出结果:

         可以看到虽然正常输出了,但是程序报错了

5.strstr

        字符串函数strstr是查找函数,在字符串中查找子串并返回子串在字符串第一次出现的地址,如果找不到子串则返回NULL

        打开cpp网站查看该函数的相关信息

        该函数的参数为两个字符指针。由于查找并不需要修改两个字符串的内容,所以两个字符指针都用const修饰,返回值为子串在字符串中第一次出现的地址

下面以经典的helloworld字符串为例:

 输出结果:

        可以看到“llo”可以在“helloworld”中找到,并返回指向“llo”’的地址,将改地址用%s打印,则从llo开始打印 ,即为lloworld

二.模拟实现常用字符串函数

1.strlen

       my_strlen模拟实现库函数strlen。参数为const char *,返回值为int型,即为字符串的长度,利用遍历字符串的方法,直到‘\0’结束遍历

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int my_strlen(const char* str)
{int len = 0;//定义长度,初始化为0while (*str != '\0')//从头开始遍历字符串,直到'\0'结束{len++;str++;}return len;//返回字符串的长度
}
int main()
{char arr1[] = "helloworld";int ret = my_strlen(arr1);printf("%d", ret);return 0;
}

   

2.strcpy

        利用my_strcpy模拟实现库函数strcpy,依次赋值,直到源字符串遍历到'\0"结束赋值,并返回预留的目标字符串的地址

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
char* my_strcpy(char* str1, const char* str2)
{char* p = str1;   //定义一个p指针保存str1,以便函数结束时返回while (*str1 = *str2)//依次赋值,直到*str2为'\0'结束{str1++;str2++;}return p;//返回预留的指针P
}
int main()
{char arr1[20] = {0};char arr2[] = "helloworld";char *str = my_strcpy(arr1,arr2);printf("%s", str);return 0;
}

    

3.strcmp

        利用my_strcmp函数模拟实现库函数strcmp,依次遍历比较,如果遇到不相等的情况则直接return返回,如果两个字符串相等,则遍历到'\0'再返回0

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int my_strcmp(const char* str1, const char* str2)/*要是不相等,下面的return会结束循环,
要是相等,则遍历到'\0'才结束*/
{while (*str1 != '\0' || *str2 != '\0'){if (*str1 < *str2)   //小于则返回-1return -1;else if (*str1 > *str2)//大于则返回1return 1;else if (*str1 == *str2)//相等则继续比较后面的字符{str1++;str2++;}}return 0;//只有相等才会执行到这一步,即相等返回0
}
int main()
{char arr1[] = "helloworla";char arr2[] = "helloworld";int ret = my_strcmp(arr1,arr2);printf("%d", ret);return 0;
}

4.strcat

        利用my_strcat函数模拟实现库函数strcat,先找到目标字符串的末尾‘\0’,然后从'\0'处依次赋值,直达遍历到源字符串的末尾'\0'

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
char* my_strcat(char* str1, const char* str2)
{char* p = str1;//保存连接字符串的地址,以便函数结束时返回while (*str1 != '\0')//遍历找到str1的'\0'处{str1++;}while (*str1 = *str2)//从str1的'\0'处依次赋值,直到遍历到str2的'\0'结束{str1++;str2++;}return p;//返回连接后字符串的地址
}
int main()
{char arr1[20] = "hello";char arr2[] = "world";char *str = my_strcat(arr1,arr2);printf("%s", str);return 0;
}

5.strstr

        利用my_strstr函数模拟实现库函数strstr,设置两个指针分别指向两个字符串,再设置一个指针P指向当前开始比较的字符的位置,直到遍历到子串的'\0'位置则已找到子串并返回子串的位置,循环节后仍咩=没有找到子串则说明找不到子串,返回NULL

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
char* my_strstr(const char* str1, const char* str2)
{const char* s1 = str1;//定义s1指向第一个字符串const char* s2 = str2;//定义s2指向第二个字符串const char* p = str1;//定义p指向第一个字符串当前开始比较的字符while (*p){s1 = p;   //从p处开始比较s2 = str2;//从头开始比较while (*s1 != '\0' && *s2 != '\0' && *s1 == *s2)//判断遍历字符是否相等{s1++;s2++;}if (*s2 == '\0')//如果是因为*s2为'\0'结束,则证明找到子串,返回子串的位置return p;p++;//一轮比较后没有找到子串,则从下一个字符开始比较}return NULL;
}
int main()
{char arr1[] = "helloworld";char arr2[] = "llo";char *str = my_strstr(arr1,arr2);printf("%s", str);return 0;
}

相关文章:

用c语言模拟实现常用字符串函数

目录 一.常用字符串函数介绍 1.strlen 2. strcpy 3.strcmp 4.strcat 5.strstr 二.模拟实现常用字符串函数 1.strlen 2.strcpy 3.strcmp 4.strcat 5.strstr 一.常用字符串函数介绍 1.strlen 字符串strlen是用来求字符串长度的&#xff0c;我们可以打开cpp网站查看有关…...

在 Flutter 中使用 webview_flutter 4.0 | 基础用法与事件处理

大家好&#xff0c;我是 17。 Flutter WebView 一共写了四篇文章 在 Flutter 中使用 webview_flutter 4.0 | 基础用法与事件处理在 Flutter 中使用 webview_flutter 4.0 | js 交互Flutter WebView 性能优化&#xff0c;让 h5 像原生页面一样优秀&#xff0c;已入选 掘金一周 …...

JavaWeb--Servlet

Servlet1 简介2 快速入门3 执行流程4 生命周期5 方法介绍6 体系结构7 urlPattern配置8 XML配置目标&#xff1a; 理解Servlet的执行流程和生命周期掌握Servlet的使用和相关配置 1 简介 Servlet是JavaWeb最为核心的内容&#xff0c;它是Java提供的一门动态web资源开发技术。 使…...

Linux启动过程

theme: channing-cyan 两种启动方式 传统启动方式&#xff08;LEGACYMBR&#xff09; 指传统BIOS启动方式&#xff0c;存在一些不足&#xff1a;比如最大只支持2TB磁盘&#xff0c;磁盘最多四个分区&#xff0c;且不支持图形操作 UEFIGPT方式 是新式的启动方式&#xff0c…...

面试资料整理——C++

C/C难题的高赞回答「中文版」 https://mp.weixin.qq.com/s/KBEnrRVb1T6LfwHgaB4jiQ C/C难题的高赞回答「中文版」&#xff0c;帮你整理好了 https://mp.weixin.qq.com/s/o9MdENiasolVT-Fllag2_Q C语言与C面试知识总结 https://mp.weixin.qq.com/s/MGSoPqPv_OzyWBS5ZdnZgw 程…...

【ArcGIS Pro二次开发】(9):GeoProcessing工具和自定义工具的调用

ArcGIS Pro自带了1000种以上的GeoProcessing工具&#xff0c;几乎可以实现所有你想要做的事。 ArcGIS Pro的二次开发并不需要我们从底层做起&#xff0c;很多功能只要学会调用工具并组合使用&#xff0c;就完全可以实现。 下面介绍如何调用系统自带的GeoProcessing工具&#x…...

皕杰报表斜线单元格、图表里或导出pdf的中文显示小方块解决方案

在皕杰报表中&#xff0c;如果含有斜线的单元格、统计图的报表、或导出pdf时&#xff0c;汉字变成小方框&#xff0c;这往往是服务器端操作系统的中文安装包没有装全&#xff0c;导致报表里用到的字体在服务器端的操作系统里找不到&#xff0c;因此成了小方块。因为斜线单元格里…...

python读写hdfs文件的实用解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。喜欢通过博客创作的方式对所学的知识进行总结与归纳,不仅形成深入且独到的理…...

RK3399+FPGA+MIPI 方案细节之subLVDS to MIPI处理

#CROSSLINK系列 #CROSSLINK vs XO3L 总的来说XO3L的灵活性更强&#xff0c;更近似于一片通用的CPLD&#xff1b;CROSSLINK专用性更强。 针对subLVDS转换到MIPI的需求&#xff0c;CROSSLINK比较有优势&#xff0c;因为集成度更高&#xff0c;所以稳定性也更高。 #要点 #crossl…...

Vue组件是怎样挂载的

我们先来关注一下$mount是实现什么功能的吧&#xff1a; 我们打开源码路径core/instance/init.js: export function initMixin (Vue: Class<Component>) {......initLifecycle(vm)// 事件监听初始化initEvents(vm)initRender(vm)callHook(vm, beforeCreate)initInject…...

gcc: 编译选项:-fdelete-null-pointer-checks、-fno-delete-null-pointer-checks

文章目录 说明实例:Linux 里的使用chatGPT说明 这个说明写的有些理解不了,可能还是不太理解(有未知的东西在里面?)。但是从这个编译选项的命名上来看还是非常明确,就是删除不必要的空指针检查。使用时要小心了,这个优化超出了编译的界限! -fdelete-null-pointer-check…...

周赛334(前缀和、贪心+双指针、Dijkstra求最短路径、二分答案)

文章目录[6369. 左右元素和的差值](https://leetcode.cn/problems/left-and-right-sum-differences/)前缀和[6368. 找出字符串的可整除数组](https://leetcode.cn/problems/find-the-divisibility-array-of-a-string/)超长整数如何取余&#xff1f;[6367. 求出最多标记下标](ht…...

imx6ull——I2C驱动

I2C基本介绍 SCL 为高电平&#xff0c;SDA 出现下降沿:起始位 SCL 位高电平&#xff0c;SDA出现上升沿:停止位 主机——从机地址&#xff08;ack&#xff09;——寄存器地址&#xff08;ack&#xff09;——数据&#xff08;ack&#xff09; 重点&#xff1a;先是写&#xff0c…...

Spring Cache的基本使用与分析

概述 使用 Spring Cache 可以极大的简化我们对数据的缓存&#xff0c;并且它封装了多种缓存&#xff0c;本文基于 redis 来说明。 基本使用 1、所需依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-…...

【安全知识】——端口复用隐藏后门

作者名&#xff1a;白昼安全主页面链接&#xff1a; 主页传送门创作初心&#xff1a; 以后赚大钱座右铭&#xff1a; 不要让时代的悲哀成为你的悲哀专研方向&#xff1a; web安全&#xff0c;后渗透技术每日鸡汤&#xff1a; 精彩的人生是在有限的生命中实现无限价值端口复用是…...

Tina_Linux量产测试使用指南_new

OpenRemoved_Tina_Linux_量产测试_使用指南_new 1 概述 文档主要描述如何配置tinatest 并搭建量产测试环境。 1.1 编写目的 • 介绍量产配置方法&#xff1b; • 介绍量产测试环境搭建流程&#xff1b; • 介绍如何使用dragonMAT 软件&#xff1b; • 方便开发人员按照说明…...

STC32单片机 普通 I/O 口中断功能介绍和使用

STC32单片机 普通 I/O 口中断功能和使用✨STC32单片机普通 I/O 口中断&#xff0c;不是传统外部中断. &#x1f516;手册上描述&#xff1a;STC32G 系列支持所有的 I/O 中断&#xff0c;且支持 4 种中断模式&#xff1a;下降沿中断、上升沿中断、低电平中断、高电平中断。每组 …...

计算机学生如何找到第一份实习?

作为一名计算机专业的学生&#xff0c;找到第一份实习是非常重要的一步&#xff0c;它不仅可以帮助你更好地了解行业&#xff0c;增加实践经验&#xff0c;还可以为即将到来的校招提供有力支持。计算机专业的校招&#xff0c;每年都在变得越来越卷。5年前&#xff0c;可能你只要…...

《Python机器学习》基础代码

1&#xff0c;要学习Python机器学习,第一步就是读入数据,这里我们以读入excel的数据为例,利用jupyter notebook来编码,具体教程看这个视频 推荐先上传到jupyter notebook,再用名字.xlsx来导入 Jupyter notebook导入Excel数据的两种方法介绍_哔哩哔哩_bilibili 2&#xff0c;…...

【前端】JS异步加载

文章目录为什么要异步加载如何实现异步加载参考为什么要异步加载 两个原因其实是一个意思。 原因1&#xff1a; JS是单线程的语言&#xff0c;它会同步的执行代码&#xff0c;从上往下执行 但是&#xff0c;一旦网络不好&#xff0c;或要加载的js文件过大的话&#xff0c;会…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

vue3 字体颜色设置的多种方式

在Vue 3中设置字体颜色可以通过多种方式实现&#xff0c;这取决于你是想在组件内部直接设置&#xff0c;还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法&#xff1a; 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器

第一章 引言&#xff1a;语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域&#xff0c;文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量&#xff0c;支撑着搜索引擎、推荐系统、…...

OkHttp 中实现断点续传 demo

在 OkHttp 中实现断点续传主要通过以下步骤完成&#xff0c;核心是利用 HTTP 协议的 Range 请求头指定下载范围&#xff1a; 实现原理 Range 请求头&#xff1a;向服务器请求文件的特定字节范围&#xff08;如 Range: bytes1024-&#xff09; 本地文件记录&#xff1a;保存已…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

三体问题详解

从物理学角度&#xff0c;三体问题之所以不稳定&#xff0c;是因为三个天体在万有引力作用下相互作用&#xff0c;形成一个非线性耦合系统。我们可以从牛顿经典力学出发&#xff0c;列出具体的运动方程&#xff0c;并说明为何这个系统本质上是混沌的&#xff0c;无法得到一般解…...