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

【C语言】模拟实现深入了解:字符串函数

请添加图片描述
🔥引言

本篇将模拟实现字符串函数,通过底层了解更多相关细节

请添加图片描述
Alt

🌈个人主页:是店小二呀
🌈C语言笔记专栏:C语言笔记
🌈C++笔记专栏: C++笔记

🌈喜欢的诗句:无人扶我青云志 我自踏雪至山巅
请添加图片描述


文章目录

  • 一、模拟实现字符串函数
    • 1.1 模拟实现Strlen
      • 1.1.1 方法一
      • 1.1.2 方法二:
      • 1.1.3 方法三:
    • 1.2 模拟实现Strcpy
      • 1.2.1方法一
      • 1.2.2 方法二
    • 1.3 模拟实现Strcat
    • 1.4 模拟实现Strcmp
    • 1.5 模拟实现Strncpy
    • 1.6 模拟实现Strncat
    • 1.7 模拟实现Strncmp
    • 1.8 模拟实现Strstr

一、模拟实现字符串函数


1.1 模拟实现Strlen

1.1.1 方法一

int main()
{char arr[] = "abcdef";int count = 0;//用于计算累积数while (arr[count] != '\0')//'\0'是不在计算的范围{count++;}printf("长度为%d\n", count);return 0;
}

1.1.2 方法二:

int main()
{char arr[] = "abcdef";int tap = 0;char* count = arr;//标记字符串的首地址while (arr[tap] != '\0') // \0是不在计算的范围{tap++;count++;}printf("长度为%d", count - arr);//指针-指针等于它们的差值return 0;
}

说明】:

  • 通过获得该字符串\0的位置,运用**指针(\0的位置)-指针(首位置)**等于两个指针的差值

1.1.3 方法三:

int pc(char* arr)
{assert(arr);//断言下if (*arr == '\0')//设计出口{return 0;}{return 1 + pc(arr + 1);}
}
int main()/
{char arr[] = "abcdef";printf("长值为%d", pc(arr));return 0;
}

说明】:

  • 字符串可以考虑使用大事化小的思想(递归)
  • 观察变化的量,得到等价关系
    在这里插入图片描述

1.2 模拟实现Strcpy

1.2.1方法一

void my_strcpy(char* dest, const char* str)
{while (*str != '\0')//判断拷贝结束条件{*dest = *str;//进行拷贝dest++;str++;}
}

说明】:

  • 两个指针指向对应的字符串,逐一拷贝
  • 虽然形参deststr是指针变量,形参不会影响到实参
  • 这里dest传递过来是地址(数组名),对此可以修改dest指向的字符串
  • dest指向的字符串需要被修改,但是src指向字符串不希望被修改

1.2.2 方法二

char* my_strcpy(char* dest, const char* str
{assert(dest != NULL);assert(str != NULL);char* ret = dest;//标记初始地址while (*dest++ = *str++)//判断和后置++打配合{}return ret;
}

说明】:

  • 这里实现逻辑跟方法一类似,只是这里循环判判断条件不同
  • 在循环判断语句中,完成拷贝赋值操作
  • 当str指针指向\0的位置,则表示循环结束
  • \0的ASCII码值是0(为假)
    在这里插入图片描述

1.3 模拟实现Strcat

char* my_strcat(char* p, const char* pc)
{assert(p != NULL);assert(pc != NULL);char* ret = p;///标记初始地址while (*p != '\0')//找到目标字符串的结束标记{p++;}while (*p++ = *pc++)//在结束标记的位置上追加,直到pc找到'\0'{}return ret;///返回初始地址
}

说明】:

  • 第一次循环:找到目标字符串的结束标记
  • 第二次循环:在结束标记的位置上追加,直到pc找到’\0’完成追加操作
    在这里插入图片描述

1.4 模拟实现Strcmp

int my_strcmp(const char* p, const char* pc)
{assert(p != NULL);assert(pc != NULL);while (*p == *pc)//不相等才要对比{if (*p == '\0')//找到结束位置了,说明两个字符串是相等的{return 0;}p++;pc++;}return *p - *pc;//用四则运算判断正负
}

说明】:

  • 循环判断是否相同
  • 相同继续向后寻找
  • 不相等则通过四则运算判断正负

1.5 模拟实现Strncpy

char* my_strncpy(char* p, const char* pc, int sz)
{assert(p != NULL);assert(pc != NULL);char* ret = p;//标记初始地址while (sz--)//拷贝次数{*p = *pc;//拷贝开始啦!p++; pc++;}return ret;//返回初始地址
}

说明】:

  • 跟模拟实现strcpy逻辑类似,只是通过一个变量控制循环次数

1.6 模拟实现Strncat

char* my_strncat(char* p, const char* pc, int sz)
{assert(p != NULL);assert(pc != NULL);char* ret = p;//标记初始地址while (*p != '\0')//找到目标字符串的结束标记{p++;	}while (sz)//追加次数,注意上篇文章可能的问题{*p = *pc;p++;pc++;sz--;	}return ret;//返回初始地址
}

说明】:

  • 跟模拟实现strcat逻辑类似,只是通过一个变量控制循环次数

1.7 模拟实现Strncmp

int my_strncmp(const char* p, const char* pc, int sz)
{assert(p != NULL);assert(pc != NULL);while (*p == *pc && sz--)//注意不同就是,次数作为判断条件{if (*p == '\0')//找到结束位置了,说明两个字符串是相等的{return 0;}p++;pc++;}return *p - *pc//用四则运算判断正负}

说明】:

  • 跟模拟实现strcmp逻辑类似,只是通过变量控制循环次数和是否不出现不相等

1.8 模拟实现Strstr

char* my_strstr(char* p, char* pc)
{assert(p && pc);char* dest = p;//标记初始地址char* str = pc;//标记初始地址if (*pc == '\0')//如果是空字符就没有不要了!{return p; }while (*dest)//字符串寻找子字符串的次数{while (*p == *pc  &&  *p  && *pc)//实现逻辑{p++;pc++;if (*pc == '\0')//子字符串都对应上了{return dest;//找到位置的指针返回}}pc = str;//上面可能找到子字符串了,但是可惜不是回归子字符串的地址			dest++;p = dest;//dest的位置推进,地毯式搜索}if (*dest == '\0')//匹配完,找不到子字符串{return NULL;}
}

在这里插入图片描述

请添加图片描述

说明】:

  • 假设原字符串是ccpd,目标字符串cp
  • 当匹配第一个字符时,可能后继都是匹配的,也可以只是部分匹配
  • 对此需要记录这个匹配位置,通过内循环遍历一次判断是否匹配
  • 如果从这个位置不匹配,则推进一位,继续循环(暴力解法)

请添加图片描述

以上就是本篇文章的所有内容,在此感谢大家的观看!这里是店小二C语言笔记,希望对你在学习C语言中有所帮助!

相关文章:

【C语言】模拟实现深入了解:字符串函数

🔥引言 本篇将模拟实现字符串函数,通过底层了解更多相关细节 🌈个人主页:是店小二呀 🌈C语言笔记专栏:C语言笔记 🌈C笔记专栏: C笔记 🌈喜欢的诗句:无人扶我青云志 我自…...

钩子函数onMounted定义了太多访问MySQL的操作 导致数据库异常

先放几种后端遇到的异常,多数和数据库有关 pymysql.err.InternalError: Packet sequence number wrong - got 102 expected 1 127.0.0.1 - - [09/May/2024 17:49:37] "GET /monitorLastTenList HTTP/1.1" 500 AttributeError: NoneType object has no at…...

Excel文件解析---超大Excel文件读写

1.使用POI写入 当我们想在Excel文件中写入100w条数据时,使用XSSFWorkbook进行写入时会发现,只有将100w条数据全部加载到内存后才会用write()方法统一写入,效率很低,所以我们引入了SXXFWorkbook进行超大Excel文件读写。 通过设置 …...

TypeScript基础:类型系统介绍

TypeScript基础:类型系统介绍 引言 TypeScript,作为JavaScript的一个超集,引入了类型系统,这为开发大型应用程序带来了诸多好处。本文将介绍TypeScript类型系统的基础知识,帮助初学者理解其概念和用法。 基础知识 …...

【Unity】Unity项目转抖音小游戏(一) 项目转换

UnityWEBGL转抖音小游戏流程 业务需求,开始接触一下抖音小游戏相关的内容,开发过程中记录一下流程。 相关参考: 抖音文档:https://developer.open-douyin.com/docs/resource/zh-CN/mini-game/develop/guide/game-engine/rd-to-SC…...

element-ui 中修改loading加载样式

element-ui 中的 loading 加载功能,默认是全屏加载效果 设置局部,需要自定义样式或者修改样式,方法如下: import { Loading } from element-uiVue.prototype.$baseLoading (text) > {let loadingloading Loading.service({…...

QT登录界面,(页面的切换)

以登陆界面为例,(QDialog) 1.主界面先构造login 的对话框类 int main(int argc, char *argv[]) {QApplication a(argc, argv);//先显示Login的界面Study_Login_Dialog login;............ }2.Login的类,可以用自定义的信号&#…...

计算机毕业设计 | vue+springboot汽车销售管理系统(附源码)

1,项目介绍 本项目基于spring boot以及Vue开发,前端实现基于PanJiaChen所提供的开源后台项目vue-element-admin改造。 针对汽车销售提供客户信息、车辆信息、订单信息、销售人员管理、财务报表等功能,提供经理和销售两种角色进行管理。 2&…...

一款开源的原神工具箱,专为现代化 Windows 平台设计,旨在改善桌面端玩家的游戏体验

Snap.Hutao 胡桃工具箱是一款以 MIT 协议开源的原神工具箱,专为现代化 Windows 平台设计,旨在改善桌面端玩家的游戏体验。通过将既有的官方资源与开发团队设计的全新功能相结合,提供了一套完整且实用的工具集,且无需依赖任何移动设…...

python日常消费数据占比分析总结年消费方向

欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一.前言 整体消费情况 消费趋势 特定领域消费数据...

MySQL变量的浮点数问题处理

schooldb库——utf8字符集——utf8_general_ci排序规则 先创建库,点击查询再去使用下列DQL。 DQL SET dx3.14,dy3.25; SELECT dxdy; #mysql浮点数计算显示异常,会有很多00000的提示 SET resultdxdy;select result;...

MWeb Pro for Mac:功能强大的Markdown博客编辑器

MWeb Pro for Mac是一款功能强大的Markdown博客编辑器,专为Mac用户设计,提供了一站式的博客写作和发布体验。这款软件不仅支持Markdown语法,还提供了丰富的编辑和排版功能,让用户能够轻松创建出精美的博客内容。 MWeb Pro的即时预…...

基于FPGA实现的HDMI TO MIPI扩展显示器方案

FPGA方案,HDMI IN接收原始HDMI 信号,输出显示到LCD 屏上 客户应用:扩展显示器 主要特性: 1.支持2K以下任意分辨率显示 2.支持OSD 叠加多个图层 3.支持MIPI/EDP/LVDS/RGB屏 4.支持放大缩小匹配屏分辨率 5.零延时,输…...

2024年美国市场亚太游戏品牌数字广告洞察报告

来源:Sensor Tower 美国是全球最大的游戏市场之一,也是亚太游戏品牌出海的重要市场。2023年Q2至2024年Q1,美国市​场广告投放额排名前10的亚太游戏品牌,合计支出 超过7.5亿美元,环比上涨23%。 排名第一的米哈游(miHoY…...

DDD面试题:DDD聚合和表的对应关系是什么 ?(来自蚂蚁面试)

尼恩说在前面: 在40岁老架构师 尼恩的读者交流群(50)中,最近有小伙伴拿到了一线互联网企业如字节、阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格,遇到很多很重要的面试题: DDD 的外部接口调用,应该放在…...

【华为】路由策略小实验

【华为】软考中级-路由策略实验 实验需求拓扑配置AR1AR2需求1需求2 AR3 检验 实验需求 1、让 R3 可以学到R1的 192.168.10.0/24和192.168.20.0/24的 路由,不能学到192.168.30.0/24。 2、让 R1可以学到 R3 的 172.16.20.0/24和172.16.30.0/24的路由,不能…...

docker安装elasticsearch:7.17.21

docker安装elasticsearch:7.17.21 下载对应版本的docker镜像 docker pull docker.elastic.co/elasticsearch/elasticsearch:7.17.21启动容器 docker run --name elasticsearch-test -p 9200:9200 -p 9300:9300 -e "discovery.typesingle-node" -t docker.elastic.…...

10.Java对象内置结构

文章目录 Java对象内置结构1.Java对象的三个部分1.1.对象头1.2.对象体1.3.对齐字节 2.对象结构中核心字段的作用2.1.MarkWord(标记字)2.2.Class Pointer(类对象指针)2.3.Array Length(数组长度)2.4.对象体2.5.对齐字节 3.Mark Word的结构信息3.1.不同锁状态下的Mark Word字段结…...

【ITK配准】第十五期 基于运动算法的可变形配准样例

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 公众号:VTK忠粉 前言 本文分享ITK配准中的基于运动算法的可变形配准,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ~YO 基于运…...

CSP-j 计算机硬件

计算机系统 计算机系统由计算机硬件和软件两部分组成。硬件包括中央处理器、存储器和外部设备等;软件是计算机的运行程序和相应的文档。计算机系统具有接收和存储信息、按程序快速计算和判断并输出处理结果等功能。 主要技术指标 字长:字长是指CPU能够同…...

Java中使用RediSearch进行高效数据检索

RediSearch是一款构建在Redis上的搜索引擎,它为Redis数据库提供了全文搜索、排序、过滤和聚合等高级查询功能。通过RediSearch,开发者能够在Redis中实现复杂的数据搜索需求,而无需依赖外部搜索引擎。本文将介绍如何在Java应用中集成并使用Red…...

NASA数据集——全球土壤顶部 1 厘米土壤湿度的网格估算值25km分辨率

AMSR-E/Aqua L2B Surface Soil Moisture, Ancillary Parms, & QC EASE-Grids V003 简介 该数据集包含土壤顶部 1 厘米土壤湿度的网格估算值,是 AMSR-E 检索足迹的平均值。土壤湿度是通过 AMSR-E/Aqua L2A亮度温度(Tb)测量值估算的&…...

翼支付——风控场景中图模型的范式变迁

目录 风控图深度学习模型 风控图大模型...

Edge视频增强功能

edge://flags/#edge-video-super-resolution 搜索Video查找 Microsoft Video Super Resolution 设置为Enabled...

C++ 概览并发

并发 资源管理 资源 程序中符合先获取后释放(显式或隐式)规律的东西,比如内存、锁、套接字、线程句柄和文件句柄等。RAII: (Resource Acquisition Is Initialization),也称为“资源获取就是初始化”,是C语言的一种管…...

04-19 周四 GitHub CI 方案设计

04-19 周四 GitHub CI 方案设计 时间版本修改人描述2024年4月19日14:44:23V0.1宋全恒新建文档2024年4月19日17:22:57V1.0宋全恒完成部署拓扑结构的绘制和文档撰写 简介 需求 由于团队最近把代码托管在GitHub上,为解决推理、应用的自动化CI的需要,调研了…...

java日常选择题

题目来自牛客网 1.以下哪个接口的定义是正确的?() A interface B { void print() {} ;} B interface B { static void print();} C.abstract interface B extends A1, A2 //A1、A2为已定义的接口 {abstract void print(){};} D.interface B { void print(); 选D,因…...

安卓串口通訊三

核心代碼如下: package com.example.comandroid;import static android.content.ContentValues.TAG;import android.graphics.Color; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView;import…...

嵌入式交叉编译:Unable to find arm_neon.h

找到文件 搜索了一下,具体目录是: /opt/linux/x86-arm/aarch64-mix210-linux/lib/gcc/aarch64-linux-gnu/7.3.0/include/arm_neon.h 解决办法 INC_ARM/opt/linux/x86-arm/aarch64-mix210-linux/lib/gcc/aarch64-linux-gnu/7.3.0/include./configure …...

Linux下工具tc详细讲解及限制IP和端口实例

首先纠正某一篇博客,TC并不是只管发包不管收包,之前我也很纳闷 知道最后看到了14年前一位大佬的帖子。是ingress! 这里有个非常重要的点就是ingress,如果父类不是他的话是完不成限制源IP的,这个关键词表明你正在添加一个入口队列规…...

哪个网站做3d模型/b2b免费推广网站

为什么80%的码农都做不了架构师?>>> 计算机网络知识 讲述计算机网络的最经典的当属Andrew S.Tanenbaum的《计算机网络》第五版,这本书难易适中。 目前已经是第五版,本书作者80年代就开发出MINIX,是一个用于…...

网页设计师培训网校/网站seo分析工具

拷贝我们的vector类型具有如下形式:class vector {private:int sz;double * elem; public:vector(int s):sz(s),elem(new double[s]){}~vector() {delete [] elem;} };让我们试图拷贝其中的一个向量:void f(int n) {vector v(3);v.set(2, 2.2);vector v2…...

网站排名快速提升/百度怎么创建自己的网站

源地址:http://devliangel.blog.51cto.com/469347/674244 构建企业服务之windows 2008 负载均衡服务器部署 项目环境: 两台Windows Server 2008 均为双网卡 IP地址 192.168.19.100(外网1) 99.99.99.99(内网1专用) 192.168.19.101(外网2) 99.99.99.100(内…...

设计好 英文网站/软文范例大全200字

3.6 BOA服务器搭建由于MJPGstreamer服务器只能传输视频信息,而本设计需要接收客户端的控制命令并且还需返回机器人的传感器数据,因此需要移植支持CGI应用脚本的服务器。BOA服务器是一个可运行在Unix或Linux下的非常小巧的单任务WEB服务器,并且…...

共青城市建设局网站/网络广告发布

简介 这节课我们将讨论如何在OSG中使用键盘和灯光。我们将会学习指定三种纹理过滤方式,学习如何使用键盘来移动场景中的立方体。 在osg中通过osgGA库来实现与用户的交互,在用户端,通常使用GUIEventAdapter类作为系统交互事件和OSG交互事件的…...

晋城网站制作/seo推广需要多少钱

E5□C(E5AC/E5EC/E5CC/E5DC)温控器如何进行AT自整定?第一步:更改控制方式为PID首先在操作菜单下按上键或下键设定目标值,然后按菜单键3秒以上进入初始设定菜单,按模式键找到CNTL选项并设为PID,即控制方式为PID方式&…...