自己手写一个字符串【C风格】

//字符串的常见操作
#include <iostream>#define MAX_SIZE 15
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status;//状态类型
typedef char ElemType;//元素类型typedef ElemType String[MAX_SIZE + 1];//第一个字节记录长度//***tring是数组,名字就是地址位置,不用指针传递
// 
//创建
Status StrAssign(String T, const char* chars)
{int length = strlen(chars);if (length > MAX_SIZE)return ERROR;T[0] = (char)length;//第一个放保存字符的长度for (int i = 1; i <= length; i++){T[i] = chars[i - 1];}return OK;
}//复制 T <-- S
Status StrCopy(String T, String S)
{for (int i = 0; i <= S[0]; i++){T[i] = S[i];//把第一个长度的字符也复制}return OK;
}//判断为空
Status StrEmpty(String T)
{return T[0] == 0 ? TRUE : FALSE;
}//比较大小 T>S:1;T==S:0,T<S:-1
int StrCompare(String T, String S)
{for (int i = 1; (i <= T[0]) && (i <= T[0]); i++){if (T[i] > S[i])return 1;else if (T[i] <  S[i])return -1;}//在双方最小的字符段长度内相同,就看字符串的长度谁大if (T[0] > S[0])return 1;else if (T[0] < S[0])return -1;else if (T[0] == S[0])return 0;
}//返回长度
Status StrLength(String T)
{return (int)T[0];
}//清空
Status ClearString(String T)
{T[0] = 0;return OK;
}//连接字符串
Status Concat(String T, String S1, String S2)
{if (((int)S1[0] + (int)S2[0]) <= MAX_SIZE){T[0] = (char)((int)S1[0] + (int)S2[0]);for (int i = 1; i <= (int)S1[0]; i++)T[i] = S1[i];for (int j = 1; j <= (int)S2[0]; j++)T[ j + (int)S1[0] ] = S2[j];return OK;}//超过了长度for (int i = 1; i <= (int)S1[0]; i++)T[i] = S1[i];for (int j = 1; j <= MAX_SIZE; j++)//第二个太长截断T[j + (int)S1[0]] = S2[j];T[0] = MAX_SIZE;return ERROR;
}//取子字符串
Status SubString(String Sub, String T, int pos, int len)
{//len不能超过剩余的字符串长度if ((len < 1) || (pos > (int)T[0]) || (pos < 1) || len > (int)T[0] - pos + 1)return ERROR;for (int i = 1; i <= len; i++){Sub[i] = T[pos + i - 1];}Sub[0] = (char)len;return OK;
}//在T里面查找S,从pos的位置开始查找,返回查找到的位置
int Index(String T, String S, int pos)
{if ((S[0] == 0) || (T[0] == 0) || (S[0] > T[0]) || (pos < 0) ||(pos > T[0]))return -1;int i = pos;int j = 1;while (i<=T[0] && j <= S[0]){if (T[i] == S[j]){j++;i++;}else{i = i - j + 2;//回退到下一位置j = 1;}}if (j > (int)S[0])return i - (int)S[0];return -1;
}//在T里面查找S,从pos的位置开始查找,返回查找到的位置
int Index2(String T, String S, int pos)
{if ((S[0] == 0) || (T[0] == 0) || (S[0] > T[0]) || (pos < 0) || (pos > T[0]))return -1;int n = StrLength(T);int m = StrLength(S);String sub;int i = 1;while (i <= n - m + 1){SubString(sub, T, i, m);if (StrCompare(sub, S) == 0)return i;i++;}return -1;
}//插入,S 插入到T的pos位置
Status StrInsert(String T, int pos, String S)
{if (pos<1 || pos > S[0] + 1)return ERROR;//只能部分插入情况if (((int)S[0] + (int)T[0]) > MAX_SIZE){//扩张原本的字符串大小,只能扩张到最大for (int i = (int)T[0]; i >= pos; i--){T[MAX_SIZE+ i- (int)T[0]] = T[ i ];}//再从pos的位置插入,插入剩余的空余位置for (int i = 1; i <= MAX_SIZE - (int)T[0]; i++){T[pos + i - 1] = S[i];}T[0] = MAX_SIZE;return ERROR;}//完全插入//扩张原本的字符串大小,并空出位置for (int i = (int)T[0]; i >= pos; i--){T[ i +(int)S[0] ]= T[i];}//再从pos的位置插入for (int i = 1; i <= (int)S[0]; i++){T[pos + i - 1] = S[i];}T[0] =(char)((int)T[0] + (int)S[0]);return OK;
}
//指定位置删除若干字符
Status StrDelete(String T, int pos, int len)
{if ((pos<1) || (pos > T[0] + 1) || (len > T[0] - pos + 1) || (pos < 0))return ERROR;for (int i = pos + len; i <= T[0]; i++)//从后面往前面覆盖删除的位置数据{T[i - len] = T[i];}T[0] = (char)((int)T[0] - len);return OK;
}//在T里面把S替换成V
Status Replace(String T, String S, String V)
{if (StrEmpty(S))return ERROR;int i = 1;while ( i > 0){i = Index(T, S, i);if ( i> 0 ){StrDelete(T, i, StrLength(S));StrInsert(T, i, V);i += StrLength(V);}}return OK;
}//显示
Status ShowString(String T)
{if (StrLength(T) == 0)return ERROR;for (int i = 1; i <= StrLength(T); i++){printf("%c", T[i]);}printf("\n\n");return OK;
}int main()
{String str, strcopy, strcat;StrAssign(str, "abcd");printf("长度:%d, 是否为空:%d(1:是 0:否)\n\n", StrLength(str),StrEmpty(str));printf("显示str:\n");ShowString(str);StrCopy(strcopy, str);printf("复制str显示strcopy:\n");ShowString(strcopy);StrAssign(strcopy, "efghijk");printf("重新显示strcopy:\n");ShowString(strcopy);printf("比较str和strcopy是否相等:%d(0:相等)\n\n", StrCompare(str, strcopy));printf("str拼接strcopy:\n");Concat(strcat, str, strcopy);ShowString(strcat);ClearString(str);printf("清空重新显示str:\n");ShowString(str);printf("长度:%d, 是否为空:%d(1:是 0:否)\n\n", StrLength(str), StrEmpty(str));SubString(str, strcat, 2, 3);printf("截取后重新显示str:\n");ShowString(str);printf("长度:%d, 是否为空:%d(1:是 0:否)\n\n", StrLength(str), StrEmpty(str));StrDelete(str, 1, 2);printf("删除重新显示str:\n");ShowString(str);printf("长度:%d, 是否为空:%d(1:是 0:否)\n\n", StrLength(str), StrEmpty(str));StrInsert(str, 2, strcopy);printf("插入重新显示str:\n");ShowString(str);printf("长度:%d, 是否为空:%d(1:是 0:否)\n\n", StrLength(str), StrEmpty(str));int ind = Index(str, strcopy, 1);printf("查找到了,位置为:%d\n",ind);printf("strcat:\n");ShowString(strcat);printf("strcopy:\n");ShowString(strcopy);printf("str:\n");ShowString(str);Replace(strcat, str, strcopy);printf("替换重新显示strcat:\n");ShowString(strcat);printf("长度:%d, 是否为空:%d(1:是 0:否)\n\n", StrLength(strcat), StrEmpty(strcat));printf("strcat插入一个更长的数:\n");String s;StrAssign(s, "123456");StrInsert(strcat, 5, s);//原本的串保留,新插入的截断printf("strcat:\n");ShowString(strcat);printf("长度:%d, 是否为空:%d(1:是 0:否)\n\n", StrLength(strcat), StrEmpty(strcat));ClearString(str);ClearString(strcopy);ClearString(strcat);printf("strcat:\n");ShowString(strcat);printf("strcopy:\n");ShowString(strcopy);printf("str:\n");ShowString(str);return 0;
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/14781.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c#自动生成缺陷图像-添加新功能(可从xml直接提取目标数据,然后进行数据离线增强)--20240524

在进行深度学习时,数据集十分重要,尤其是负样本数据。 故设计该软件进行深度学习数据预处理,最大可能性获取较多的模拟工业现场负样本数据集。 该软件基于VS2015、.NETFrameWork4.7.2、OpenCvSharp1.0.0.0、netstandard2.0.0.0、SunnyUI3.2.9.0、SunnyUI.Common3.2.9.0及Ope…

C盘磁盘空间不够用,怎样将d盘的空间划分给c盘?

C盘磁盘空间不够用&#xff0c;怎样将d盘的空间划分给c盘&#xff1f; 背景&#xff1a;win10系统下。C盘原有50G&#xff0c;如今只剩下8G&#xff0c;已经捉襟见肘了&#xff0c;想从D盘&#xff0c;割100G给C盘&#xff0c;以后软件能直接装C盘了。操作步骤如下&#xff1a…

2024年人文艺术与创新教育国际学术会议(ICHAIE 2024)

2024年人文艺术与创新教育国际学术会议&#xff08;ICHAIE 2024) 2024 International Conference on Humanities, Arts and Innovation Education 一、【会议简介】 随着全球化的推进和科技的迅猛发展&#xff0c;人文艺术与创新教育在培养未来人才方面扮演着越来越重要的角色…

springboot事务结合分布式锁超卖问题

背景 商品销售扣减库存是常见的场景&#xff0c;考虑性能的可以使用redis存储库存进行扣减&#xff0c;并发小的也可以采用数据量库存占用记录实时计算方式&#xff0c;最近开发的功能由于并发量不大&#xff0c;考虑到实现简洁的因素&#xff0c;决定采用库存占用记录实时计算…

后端之路第二站(正片)——SprintBoot之:设置请求接口

这一篇讲怎么简单结合模拟云接口&#xff0c;尝试简单的后端接接口、接受并传数据 一、下载Apifox接口文档软件 目前的企业都是采用前后端分离开发的&#xff0c;在开发阶段前后端需要统一发送请求的接口&#xff0c;前端也需要在等待后端把数据存到数据库之前&#xff0c;自己…

初始MyBatis ,详细步骤运行第一个MyBatis程序,同时对应步骤MyBatis底层剖析

1. 初始MyBatis &#xff0c;详细步骤运行第一个MyBatis程序&#xff0c;同时对应步骤MyBatis底层剖析 文章目录 1. 初始MyBatis &#xff0c;详细步骤运行第一个MyBatis程序&#xff0c;同时对应步骤MyBatis底层剖析每博一文案2. 前沿知识2.1 框架&#xff08;framework&#…

剪画小程序:3个方法:告诉你如何将普通的照片转换成动漫二次元风格!

Hello&#xff01;亲爱的小伙伴们&#xff01; 你是否还在纠结于自己的自拍太普通&#xff0c;每次分享到社交账号上都觉得平平无奇&#xff0c;引不起波澜&#xff1f; 假如&#xff0c;你和朋友们一起出去玩&#xff0c;大家都开心地拍着自拍。你看着自己的照片&#xff0c…

蓝桥杯-数三角(ac代码时间复杂度分析)

问题描述 小明在二维坐标系中放置了 ( n ) 个点&#xff0c;他想在其中选出一个包含三个点的子集&#xff0c;这三个点能组成三角形。然而这样的方案太多了&#xff0c;他决定只选择那些可以组成等腰三角形的方案。请帮他计算出一共有多少种选法可以组成等腰三角形&#xff1f…

WXML模板语法-事件绑定

一、 1.事件 事件是渲染层到逻辑层的通讯方式&#xff0c;通过事件可以将用户在渲染层产生的行为&#xff0c;反馈到逻辑层进行业务的处理 2.小程序中常用的事件 3.事件对象的属性列表 当事件回调触发的时候&#xff0c;会收到一个事件对象event&#xff0c;其属性为&#x…

在uni-app 插件市场下载 SKU 插件之后,引入项目报错问题

引入&#xff1a; git 提交报错&#xff1a; 原因&#xff1a;项目使用了 eslint 语法检查 解决&#xff1a;禁用 eslint 语法规则 在<script> 标签下面添加 /* eslint-disable */ 重新提交即可

【网络技术】【Kali Linux】Wireshark嗅探(十四)QUIC(快速UDP互联网连接)协议报文捕获及分析

往期 Kali Linux 上的 Wireshark 嗅探实验见博客&#xff1a; 【网络技术】【Kali Linux】Wireshark嗅探&#xff08;一&#xff09;ping 和 ICMP 【网络技术】【Kali Linux】Wireshark嗅探&#xff08;二&#xff09;TCP 协议 【网络技术】【Kali Linux】Wireshark嗅探&…

移动硬盘容量消失无法读取的解决方案

在数字化时代&#xff0c;数据的存储和备份变得尤为重要。移动硬盘作为一种便捷、大容量的存储设备&#xff0c;受到许多人的青睐。然而&#xff0c;有时我们可能会遭遇这样的问题&#xff1a;移动硬盘不显示容量且无法访问。这种情况无疑给我们的数据存储和管理带来了巨大的困…

uniapp移动端骨架屏流程

1.使用微信开发者工具来生成骨架屏&#xff1b;在分窗模式下选择页面信息&#xff0c;下拉选择生成骨架屏&#xff1b;他会基于当前页面生成骨架屏的样式 点击确定&#xff1b; 会自动生成这两个文件&#xff1b;一个是html结构文件&#xff0c;一个是css样式文件。 然后把这两…

黄石首家Pearson VUE国际认证考试中心落户湖北理工学院

Pearson VUE 作为 Pearson 集团的专门从事计算机化考试服务的公司&#xff0c;到目前为止&#xff0c;已在全世界165 个国家授权了 4400 多个考试中心以及超过 230 家 PVUE 自有考试中心&#xff0c;其中在中国的有三百多个授权考点和 4 个自有考试中心。Pearson VUE 以其技术和…

LLaMa系列模型详解(原理介绍、代码解读):LLaMA 3

LLaMA 3 2024年4月18日&#xff0c;Meta 重磅推出了Meta Llama 3&#xff0c;Llama 3是Meta最先进开源大型语言模型的下一代&#xff0c;包括具有80亿和700亿参数的预训练和指令微调的语言模型&#xff0c;能够支持广泛的应用场景。这一代Llama在一系列行业标准基准测试中展示…

java学习四

Random 随机数 数组 静态初始化数组 数组在计算机中的基本原理 数组的访问 什么是遍历 数组的动态初始化 动态初始化数组元素默认值规则 Java内存分配介绍 数组在计算机中的执行原理 使用数组时常见的一个问题 案例求数组元素最大值 public class Test1 {public static void ma…

<工控><PLC>汇川Easy521系列PLC与汇川SV630N伺服进行EtherCat通讯的相关配置及指令编写

前言 本系列是关于PLC相关的博文&#xff0c;包括PLC编程、PLC与上位机通讯、PLC与下位驱动、仪器仪表等通讯、PLC指令解析等相关内容。 PLC品牌包括但不限于西门子、三菱等国外品牌&#xff0c;汇川、信捷等国内品牌。 除了PLC为主要内容外&#xff0c;PLC相关元器件如触摸屏…

【Unity3D美术】URP渲染管线学习01

扫盲简介 URP渲染管线是Unity3d提供的一种视觉效果更好的渲染模式&#xff0c;类似的还有Built RP&#xff08;默认最普通的渲染模式&#xff09;\ HDRP(超高清&#xff0c;对设备要求高)&#xff0c;视觉效果好&#xff0c;而且占用资源少&#xff01;成为主流渲染管线模式&a…

基于Docker部署GitLab环境搭建

文件在D:\E\学习文档子目录压缩\专项进阶&#xff0c;如ngnix,webservice,linux,redis等\docker 建议虚拟机内存2G以上 1.下载镜像文件 docker pull beginor/gitlab-ce:11.0.1-ce.0 注意&#xff1a;一定要配置阿里云的加速镜像 创建GitLab 的配置 (etc) 、 日志 (log) 、数…

成功案例(IF=7.4)| 代谢组+16s联合分析助力房颤代谢重构的潜在机制研究

研究背景 心房颤动&#xff08;AF&#xff09;是临床上最常见的持续性心律失常&#xff0c;具有显著的发病率和死亡率。高龄是房颤发病率、患病率和进展最显著的危险因素。与年龄在50-59岁之间的参与者相比&#xff0c;80-89岁之间的参与者患房颤的风险增加了9.33倍。目前尚不…