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

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

TDengine 快速体验(Docker 镜像方式)

简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能&#xff0c;本节首先介绍如何通过 Docker 快速体验 TDengine&#xff0c;然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker&#xff0c;请使用 安装包的方式快…...

基于FPGA的PID算法学习———实现PID比例控制算法

基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容&#xff1a;参考网站&#xff1a; PID算法控制 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&…...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成

一个面向 Java 开发者的 Sring-Ai 示例工程项目&#xff0c;该项目是一个 Spring AI 快速入门的样例工程项目&#xff0c;旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计&#xff0c;每个模块都专注于特定的功能领域&#xff0c;便于学习和…...

【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制

目录 节点的功能承载层&#xff08;GATT/Adv&#xff09;局限性&#xff1a; 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能&#xff0c;如 Configuration …...

DAY 26 函数专题1

函数定义与参数知识点回顾&#xff1a;1. 函数的定义2. 变量作用域&#xff1a;局部变量和全局变量3. 函数的参数类型&#xff1a;位置参数、默认参数、不定参数4. 传递参数的手段&#xff1a;关键词参数5 题目1&#xff1a;计算圆的面积 任务&#xff1a; 编写一…...

pgsql:还原数据库后出现重复序列导致“more than one owned sequence found“报错问题的解决

问题&#xff1a; pgsql数据库通过备份数据库文件进行还原时&#xff0c;如果表中有自增序列&#xff0c;还原后可能会出现重复的序列&#xff0c;此时若向表中插入新行时会出现“more than one owned sequence found”的报错提示。 点击菜单“其它”-》“序列”&#xff0c;…...