当前位置: 首页 > 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能够同…...

从菜单式MES到工业智能体:基于Hermes Agent+MCP的智能助手实战指南(完整源代码)

目录 为什么 MES 需要从“系统界面”进化为“业务助手” 设计哲学:工业 Agent 不是套壳聊天机器人 技术选型:为什么选择 Hermes Agent + MCP 总体架构:四层解耦与认知-动作分离 核心模块一:数据服务层,先构造一个可验证的工业世界 核心模块二:MCP 工具层,把业务能力暴露…...

EBERLE AD-41/051475000100模拟输入模块

EBERLE AD-41/051475000100模拟输入模块专为工业现场设计,用于采集传感器信号,具备高精度与高可靠性。多通道输入:支持4或8通道,节省空间。信号兼容:可配置接入0-20mA、4-20mA或0-10V信号。高分辨率:12-16位…...

如何在fastbook中实现自定义损失函数:从基础到实践的完整指南

如何在fastbook中实现自定义损失函数:从基础到实践的完整指南 【免费下载链接】fastbook The fastai book, published as Jupyter Notebooks 项目地址: https://gitcode.com/gh_mirrors/fa/fastbook 损失函数是深度学习模型训练的核心组件,它指导…...

利川乡村民宿:口碑驱动的选品与运营策略解析

利川乡村民宿:口碑驱动的选品与运营策略解析“‘利川乡村民宿的核心竞争力,从来不是装修多豪华,而是能否让游客真正享受清凉与安心’——这是利川乡村民宿行业的共识,但如何选到靠谱的民宿、理解其运营逻辑,却困扰着不…...

Translumo:5分钟掌握终极免费实时屏幕翻译,打破语言障碍的完整指南

Translumo:5分钟掌握终极免费实时屏幕翻译,打破语言障碍的完整指南 【免费下载链接】Translumo Advanced real-time screen translator for games, hardcoded subtitles in videos, static text and etc. 项目地址: https://gitcode.com/gh_mirrors/tr…...

Docker 27跨架构镜像构建避坑手册(27个真实CI/CD故障现场复盘)

更多请点击: https://intelliparadigm.com 第一章:Docker 27跨架构镜像构建全景认知 Docker 27 引入了原生增强的跨架构镜像构建能力,依托 BuildKit 的深度集成与 QEMU 用户态模拟的自动化协同,显著降低了 multi-arch 构建的运维…...

SILICON芯科 EFR32MG24A020F1024IM40-BR QFN40 无线收发芯片

1.功能列表 EFR32MG24的突出特性如下所示。 低功耗无线系统级芯片 高性能32位78MHzARMCortex-M33,配备DSP指 令和浮点单元,用于高效信号处理 最高1536kB闪存程序内存 最多256kB RAM数据存储 2.4GHz无线通信操作 用于AI/ML加速的矩阵向量处理器 无线性能 …...

对接 Claude Code 编程助手时配置 Taotoken 作为 API 提供商

对接 Claude Code 编程助手时配置 Taotoken 作为 API 提供商 1. 准备工作 在开始配置前,请确保已注册 Taotoken 账号并获取有效的 API Key。登录控制台后,可在「API 密钥管理」页面创建新密钥。同时,在「模型广场」查找 Claude 系列模型的 …...

从哈工大论文到你的DSP:ESO谐波抑制算法移植实战,附C代码核心片段与调试心得

ESO谐波抑制算法在永磁同步电机控制中的工程实现 永磁同步电机(PMSM)因其高效率、高功率密度等优势,在工业驱动、电动汽车等领域广泛应用。然而在实际运行中,逆变器非线性特性(如死区效应)和电机本体特性(如磁链谐波)会导致相电流中出现5、7次谐波&#…...

W3x2lni如何解决魔兽争霸III地图格式兼容性难题?

W3x2lni如何解决魔兽争霸III地图格式兼容性难题? 【免费下载链接】w3x2lni 魔兽地图格式转换工具 项目地址: https://gitcode.com/gh_mirrors/w3/w3x2lni 魔兽争霸III地图开发者面临的最大挑战之一就是地图文件在不同编辑器、版本和发布平台之间的格式兼容性…...