数据结构篇其六-串
数据结构—串
前置说明
由于学习Java面向对象语言走火入魔,试图在C语言中模拟实现面向对象设计。里面加入了大量的函数指针配合结构体来模拟类中的成员方法
故此篇,亦可称:
面向对象的C语言程序设计
用C语言实现串这种数据结构,并将它应用到解决实际问题。
C语言特性的,麻烦的,不如自动回收的要手动管理内存,容易出Bug的。(bushi。
编程语言:C语言
IDE:VS Code
函数实现灵感:出于Java中的String类提供的方法,在C语言实现一下。
串介绍
由于版本更替,计算机对字符处理越来越多,引入了字符串的概念。
串:由零或多个字符组成的有限序列,又称字符串
一般记为s=“a1a2……an”,s为串的名称,用双引号引起来,部分语言由单引号,三引号的写法。
串的长度串的可见字符数目个数就是串的长度,就是上面的a1,a2……,an。
空串空串的长度为0,空串用"“表示。
主串与字串最初的串为主串,在主串中取一部分连续的字符序列得到一个新串,该串称为字符串的子串。比如"String"其字串可以是"S”,“Str”,""等。
串的比较两个串的比较是比较相应位置的字符,在ASCII码集中每个字符都与整数建立了一一映射。
如比较silly,stupid.第一个字符相等,那么比较第二个字符i,t。我们只需要记得ASCII码集中小写字母的编码是递增关系,而26字母表,i在t前面,故认为
“i<t”,比较结束,我们认为silly比stupid小。比较逻辑是这样的。
若两个串长度不一,其中一个串比较完了,那么认为长串更大。
两个串相等的充分必要条件:两个串长度相等且对应字符一一相等。
使用说明
1.若在栈上创建String类型 变量,如String s,需要进行
String s={.Init=StrInit},结构体的局部初始化
如下图
#include"String.h"
//很可惜不能实现像Java中的this关键字来隐式传递参数。
int main(){//Object-oriented Programming in CString s={.Init=StrInit};s.Init(&s);s.append(&s,"hello");s.toString(&s);printf("\n");s.append(&s,",world!");s.toString(&s);return 0;
}
2.若在栈上创建一个String* 的指针变量,需要调用newString函数,
String* str=newString();newString会在堆上创建一个这样的String变量并返回其地址。
int main(){//Object-oriented Programming in CString* str=newString();str->append(str,"hello, ");char* arr="1,2,3,4,5";str->valueOfCharArrays(str,arr);str->toString(str);return 0;
}
3.由于结构体内置freememory函数指针,通过指针来调用函数可以回收自身内存,调用后相当于销毁了自身。若采用指针,请注意将该指针置空。
4.这里麻烦点在于不好好管理内存容易泄露。
结构体说明(串的顺序结构)
以下是动态字符串定义,全称Dynamic String,简称string。
注意前面字段定义,很显然这是顺序结构的定义。
串的顺序结构是用一组地址连续的存储单元存储串中的字符序列,为了摆脱原有字符串的固定性,我们选择堆区的内存以便我们实现动态扩容。
我们把\0踢出在外,但注意\0还是存在,只不过由我们内部函数封装好,始终给\0预留空间,不对外显示,使用不受\0限制。
typedef struct string{//顺序表!】//字段/属性/成员char* a;//字符指针int length;//记录当前字符串的长度,也是有效长度。int capacity;//只记录实际有效的字符容量,不包括'\0','\0'始终额外留一个字节空间。//--------------------------------------------------------------//成员函数,用函数指针模拟一下//get函数int (*getLength)(struct string* self);//获取当前字符串的长度,相当于C库中string函数。//操作字符串函数void (*toString)(struct string* self);//打印字符串void (*append)(struct string* self,const char* str);//连接字符串bool (*empty)(struct string* self);//判断字符串是否为空串。struct string* (*substring)(struct string* self,int startIndex,int endIndex);//原字符串中创建一个对应区间[startIndex,endIndex)的子字符串。//整型,浮点型,字符数组,单个字符的转化为字符串void (*valueOfInt)(struct string* self,int val);void (*valueOfLong) (struct string* self,long val);void (*valueOfFloat) (struct string* self,float val);void (*valueOfDouble) (struct string* self,double val);void (*valueOfCharArrays)(struct string* self,char val[]);//动态字符串之间的操作void (*copyOf)(struct string* self,struct string* other);//动态字符串之间的拷贝。int (*compareTo)(struct string* self,struct string* other);//比较两个字符串大小bool (*equal)(struct string* self,struct string* other);//比较字符串是否相等。int (*indexOf)(struct string* S,struct string* T,int pos);//BF算法求子串在主串指定pos之后的下标。//管理内存 void (*Init)(struct string* str); //字符串普通变量构造函数void (*reset)(struct string* self);//重置字符串,如同一开始初始化一样。效果和newString之后相同。void (*freememory)(struct string* self);//销毁自身,释放所有动态内存。使用此方法后记得将原有指针置空处理。
}String;
函数说明
gitte
测试不够严谨,难免出错。请自行学习,并在评论区指正错误,谢读。
相关文章:
数据结构篇其六-串
数据结构—串 前置说明 由于学习Java面向对象语言走火入魔,试图在C语言中模拟实现面向对象设计。里面加入了大量的函数指针配合结构体来模拟类中的成员方法 故此篇,亦可称: 面向对象的C语言程序设计 用C语言实现串这种数据结构,并将它应用到…...
队列和栈的实现
本节讲解的队列与栈,如果你对之前的线性和链式结构顺利掌握了,那么下边的队列和栈就小菜一碟了。因为我们会用前两节讲到的东西来实现队列和栈。 之所以放到一起讲是因为这两个东西很类似,队列是先进先出结构(FIFO, first in first out)&…...
lua vm 五: upvalue
前言 在 lua vm 中,upvalue 是一个重要的数据结构。upvalue 以一种高效的方式实现了词法作用域,使得函数能成为 lua 中的第一类值,也因其高效的设计,导致在实现上有点复杂。 函数 (proto) upvalue 构成了闭包(closu…...
React Native中集成ArcGIS以显示地图、渲染自定义图层和获取地理信息数据
在您的数据采集上传的应用中集成ArcGIS以显示地图、渲染自定义图层和获取地理信息数据是一项常见需求。下面是如何实现这些功能的详细指南,包括具体步骤和示例代码。 1. 显示地图 原生开发 Android: 使用ArcGIS Android SDK。您需要在AndroidManifest…...
java中的异常-异常处理(try、catch、finally、throw、throws)+自定义异常
一、概述 1、java程序员在编写程序时提前编写好对异常的处理程序,在程序发生异常时就可以执行预先设定好的处理程序,处理程序执行完之后,可以继续向后执行后面的程序 2、异常处理程序是在程序执行出现异常时才执行的 二、5个关键字 1、tr…...
深入了解反射
newInstance 可访问性限制: newInstance()方法只能调用无参的公共构造函数。如果类没有无参公共构造函数,那么newInstance()方法将无法使用。 异常处理: newInstance()方法在创建对象时会抛出受检异常InstantiationException和IllegalAcces…...
5、搭建前端项目
5.1 使用vite vue搭建 win r 打开终端 切换到你想要搭建的盘 npm init vitelatest跟着以下步骤取名即可 cd fullStackBlognpm installnpm run dev默认在 http://localhost:5173/ 下启动了 5.2 用vscode打开项目并安装需要的插件 1、删除多余的 HelloWorld.vue 文件 2、安装…...
LLM之Agent初探
Agent是什么? Agent一词起源于拉丁语中的Agere,意思是“to do”。在LLM语境下,Agent可以理解为在某种能自主理解、规划决策、执行复杂任务的智能体。 Agent并非ChatGPT升级版,它不仅告诉你“如何做”,更会帮你去做。…...
目录穿越漏洞CVE-2018-7171复现 又学到一招小技巧!!!!
还是半夜睡不着,打开靶机开始操作。今天看了文件下载和目录穿越漏洞想结合以及防御方法。半夜来进行操作一波。复现一下漏洞,这个网上的文章页比较的少!!! 开始操作起来!!! 进入到页…...
代码随想录算法训练营day41
题目:01背包理论基础、416. 分割等和子集 参考链接:代码随想录 动态规划:01背包理论基础 思路:01背包是所有背包问题的基础,第一次看到比较懵,完全不知道dp数据怎么设置。具体分析还是dp五部曲ÿ…...
从0~1开发财务软件
1.获取图形验证码接口 功能要求 1、随机生成6位字符 2、将字符生成base64位格式的图片,返回给前端 3、将生成的字符存储到redis中,用匿名身份id(clientId)作为key,验证码作为value。 clientId通过/login/getClien…...
Python实现连连看9
(2)标识选中的图片 在判断出玩家选中的是哪一张图片之后,接下来就可以标识选中的图片了,即在该选中的图片外围画矩形。代码如下所示。 FIRSTCLICK True #FIRSTCLICK是全局变量 if(click_col>0 and click_row>0) and \(no…...
项目验收总体计划书(实际项目验收原件参考Word)
测试目标:确保项目的需求分析说明书中的所有功能需求都已实现,且能正常运行;确保项目的业务流程符合用户和产品设计要求;确保项目的界面美观、风格一致、易学习、易操作、易理解。 软件全套文档过去进主页。 一、 前言 ࿰…...
C++基础与深度解析 | 异常处理 | 枚举与联合 | 嵌套类与局部类 | 嵌套名字空间与匿名名字空间 | 位域与volatile关键字
文章目录 一、异常处理二、枚举与联合三、嵌套类与局部类四、嵌套名字空间与匿名名字空间五、位域与volatile关键字 一、异常处理 异常处理用于处理程序在调用过程中的非正常行为。 传统的处理方法:传返回值表示函数调用是否正常结束。 例如,返回 0 表示…...
番外篇 | 利用华为2023最新Gold-YOLO中的Gatherand-Distribute对特征融合模块进行改进
前言:Hello大家好,我是小哥谈。论文提出一种改进的信息融合机制Gather-and-Distribute (GD) ,通过全局融合多层特征并将全局信息注入高层,以提高YOLO系列模型的信息融合能力和检测性能。通过引入MAE-style预训练方法,进一步提高模型的准确性。🌈 目录 🚀1.论文解…...
python记录之字符串
在Python中,字符串是一种非常常见且重要的数据类型,用于存储文本信息。下面,我们将对Python字符串进行深入的讲解,包括其基本操作、常见方法、格式化以及高级特性。 1. 字符串的创建 在Python中,字符串可以通过单引号…...
Elasticsearch 认证模拟题 - 15
一、题目 原索引 task1 的字段 title 字段包含单词 The,查询 the 可以查出 1200 篇文档。重建 task1 索引为 task1_new,重建后的索引, title 字段查询 the 单词,不能匹配到任何文档。 PUT task1 {"mappings": {"…...
g++ 预处理 编译 汇编 链接 命令
g 预处理 编译 汇编 链接 命令 在命令行中使用 g 预处理、编译、汇编和链接源代码文件通常遵循以下步骤: 预处理(Preprocessing):将源代码文件转换为经过预处理器处理的中间文件。 g -E source.cpp -o source.i 编译ÿ…...
计算机视觉中的low-level与 high-level任务
文章目录 low-level任务high-level任务区别联系others参考在计算机视觉领域中,low-level任务和high-level任务是两个重要的概念,他们分别涉及图像处理和分析的不同的层次。 low-level任务 low-level任务主要关注的是图像的底层特征,如颜色、纹理、边缘、形状等。通常涉及对…...
安徽京准NTP时钟系统:GPS北斗卫星授时下的生活重塑
安徽京准NTP时钟系统:GPS北斗卫星授时下的生活重塑 安徽京准NTP时钟系统:GPS北斗卫星授时下的生活重塑 时间的流逝自古以来时钟都是人类生活与活动的基础。然而,随着科技的进步,我们对时间管理和测量的方法已经发生了翻天覆地的变…...
别再手动敲数据了!SAS PROC IMPORT保姆级教程:从Excel、CSV到TXT文件一键导入
SAS数据导入革命:用PROC IMPORT告别低效手工操作 1. 为什么你需要掌握PROC IMPORT? 每天早晨9点,刚入职的数据分析师小李都会面临同样的噩梦——业务部门发来的几十份Excel、CSV和TXT文件堆满了邮箱。手动复制粘贴不仅耗时费力,还…...
用Python和Matlab可视化高斯分布融合:从理论到代码,理解卡尔曼滤波的‘信任权重’
高斯分布融合的可视化实践:用Python与Matlab揭秘卡尔曼滤波的信任机制 在传感器融合、机器人定位和金融预测等领域,我们常常需要将多个不确定信息源的数据进行整合。高斯分布(正态分布)作为描述不确定性的黄金标准,其融…...
LumenPnP真空系统架构:双喷嘴拾放技术深度解析
LumenPnP真空系统架构:双喷嘴拾放技术深度解析 【免费下载链接】lumenpnp The LumenPnP is an open source pick and place machine. 项目地址: https://gitcode.com/gh_mirrors/lu/lumenpnp LumenPnP作为一款开源桌面贴片机,其真空系统是实现精准…...
如何快速安装HS2汉化补丁:完整游戏优化指南
如何快速安装HS2汉化补丁:完整游戏优化指南 【免费下载链接】HS2-HF_Patch Automatically translate, uncensor and update HoneySelect2! 项目地址: https://gitcode.com/gh_mirrors/hs/HS2-HF_Patch HS2-HF Patch是HoneySelect2玩家的终极解决方案…...
VideoDownloadHelper深度解析:破解主流视频平台下载限制的技术实战
VideoDownloadHelper深度解析:破解主流视频平台下载限制的技术实战 【免费下载链接】VideoDownloadHelper Chrome Extension to Help Download Video for Some Video Sites. 项目地址: https://gitcode.com/gh_mirrors/vi/VideoDownloadHelper 还在为无法保存…...
突破大语言模型平滑诅咒:Emergence Codex语义架构与OpenClaw实战指南
1. 项目概述:什么是 Emergence Codex 与 OpenClaw Skill如果你和我一样,在深度使用大语言模型(LLM)构建智能体或进行复杂推理任务时,常常感到一种无力感——无论你怎么精心设计提示词(Prompt)&a…...
NVIDIA配置工具深度解析:驱动级游戏性能调优技术实践
NVIDIA配置工具深度解析:驱动级游戏性能调优技术实践 【免费下载链接】nvidiaProfileInspector 项目地址: https://gitcode.com/gh_mirrors/nv/nvidiaProfileInspector NVIDIA Profile Inspector是一款专业的显卡驱动配置工具,它允许技术爱好者深…...
Chopstick工具:高效管理多Git仓库的批量操作与自动化实践
1. 项目概述与核心价值 最近在GitHub上看到一个挺有意思的项目,叫 chopstick ,作者是DustinMeyer1010。光看名字你可能会联想到筷子,但它的实际功能跟餐具可没半点关系。这是一个专门用于 代码仓库(Repository)克隆…...
告别龟速下载!用阿里云镜像和离线包5分钟搞定DBeaver所有JDBC驱动
告别龟速下载!用阿里云镜像和离线包5分钟搞定DBeaver所有JDBC驱动 每次打开DBeaver准备连接数据库,最让人抓狂的就是等待JDBC驱动下载的进度条。特别是在某些网络环境下,一个简单的MySQL驱动下载可能需要十几分钟,甚至直接失败。作…...
智慧交通系统安全漏洞深度解析:从明文传输到固件攻击的防御启示
1. 项目概述:一次对智慧交通“神经末梢”的深度安全审视2014年的DEF CON黑客大会,向来是安全研究的风向标。那一年,IOActive的首席技术官Cesar Cerrudo在台上展示的,不是某个炫酷的软件漏洞,而是一个关于我们每天经过的…...
