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

串---顺序串实现

顺序串详解

本文档将详细介绍顺序串的基本概念、实现原理及其在 C 语言中的具体应用。通过本指南,读者将了解如何使用顺序串进行各种字符串操作。

1. 什么是顺序串?

顺序串是一种用于存储字符串的数据结构,它使用一组连续的内存空间来保存字符串中的字符序列。顺序串通常由两部分组成:

  • 一个字符数组 data[],用于存储实际的字符数据。
  • 一个整数 length,用于记录字符串的实际长度。

在本程序中,我们定义了一个名为 SequentialString 的结构体来表示顺序串。

typedef struct SequentialString {char data[MaxSize]; // 实际字符int length;         // 字符串长度
} SequentialString;

其中 MaxSize 是一个预定义的最大字符串长度常量。

2. 基本操作

2.1 生成串 (StrAssign)

此函数用于将一个 C 语言字符串转换为顺序串。

void StrAssign(SequentialString &s, const char str[]);

参数:

  • s: 目标顺序串。
  • str: 源 C 语言字符串。

功能:

  • 复制 str 中的所有字符到 s.data[],并设置 s.length 为实际复制的字符数量。

2.2 复制串 (StrCopy)

此函数用于将一个顺序串复制到另一个顺序串。

void StrCopy(SequentialString &s, SequentialString t);

参数:

  • s: 目标顺序串。
  • t: 源顺序串。

功能:

  • 复制 t 的所有字符到 s.data[],并设置 s.lengtht.length 相同。

2.3 判断是否为空串 (StrEmpty)

此函数用于检查一个顺序串是否为空。

bool StrEmpty(SequentialString &s);

参数:

  • s: 要检查的顺序串。

返回值:

  • 如果 s.length 为 0,则返回 true;否则返回 false

2.4 判断两个串是否相等 (StrEqual)

此函数用于检查两个顺序串是否相等。

bool StrEqual(SequentialString s, SequentialString t);

参数:

  • s: 第一个顺序串。
  • t: 第二个顺序串。

返回值:

  • 如果两个串的长度相同且所有字符都相等,则返回 true;否则返回 false

2.5 获取串的长度 (StrLength)

此函数用于获取一个顺序串的长度。

int StrLength(SequentialString s);

参数:

  • s: 要获取长度的顺序串。

返回值:

  • 返回 s.length

2.6 串的连接 (Concat)

此函数用于将两个顺序串连接成一个新的顺序串。

SequentialString Concat(SequentialString s, SequentialString t);

参数:

  • s: 第一个顺序串。
  • t: 第二个顺序串。

返回值:

  • 返回一个新的顺序串,该串包含 st 的所有字符。

2.7 获取子串 (SubStr)

此函数用于从一个顺序串中获取指定位置的子串。

SequentialString SubStr(SequentialString s, int i, int j);

参数:

  • s: 原始顺序串。
  • i: 子串的起始位置(1-indexed)。
  • j: 子串的长度。

返回值:

  • 返回一个新的顺序串,该串包含 s 从位置 i 开始的长度为 j 的子串。

2.8 子串插入 (InsertStr)

此函数用于在一个顺序串的指定位置插入另一个顺序串。

SequentialString InsertStr(SequentialString s1, SequentialString s2, int i);

参数:

  • s1: 原始顺序串。
  • s2: 要插入的顺序串。
  • i: 插入位置(1-indexed)。

返回值:

  • 返回一个新的顺序串,该串包含 s1 和在位置 i 插入的 s2

2.9 子串删除 (DelStr)

此函数用于从一个顺序串中删除指定位置的子串。

SequentialString DelStr(SequentialString s, int i, int j);

参数:

  • s: 原始顺序串。
  • i: 子串的起始位置(1-indexed)。
  • j: 子串的长度。

返回值:

  • 返回一个新的顺序串,该串包含 s 除位置 i 开始的长度为 j 的子串外的所有字符。

2.10 子串替换 (RepStr)

此函数用于在一个顺序串的指定位置替换一个子串。

SequentialString RepStr(SequentialString s, int i, int j, SequentialString t);

参数:

  • s: 原始顺序串。
  • i: 要替换子串的起始位置(1-indexed)。
  • j: 要替换子串的长度。
  • t: 新的子串。

返回值:

  • 返回一个新的顺序串,该串包含 s 除位置 i 开始的长度为 j 的子串被 t 替换外的所有字符。

2.11 输出串 (displayStr)

此函数用于显示一个顺序串的内容。

void displayStr(SequentialString s);

参数:

  • s: 要显示的顺序串。

2.12 串的比较 (StrCompare)

此函数用于比较两个顺序串。

int StrCompare(SequentialString s, SequentialString t);

参数:

  • s: 第一个顺序串。
  • t: 第二个顺序串。

返回值:

  • 如果 st 相等,返回 0;
  • 如果 s 小于 t,返回负数;
  • 如果 s 大于 t,返回正数。

3. 示例程序

下面是一个示例程序,演示了如何使用上述定义的功能。

#include <stdio.h>
#include <stdlib.h>#define MaxSize 100// 定义顺序串的结构体
typedef struct SequentialString {char data[MaxSize]; // 实际字符int length;         // 字符串长度
} SequentialString;// 生成串
void StrAssign(SequentialString &s, const char str[]) {int i;for (i = 0; str[i] != '\0'; i++) { // 复制字符直到遇到空字符s.data[i] = str[i];}s.length = i; // 设置字符串长度
}// 复制串
void StrCopy(SequentialString &s, SequentialString t) {int i;for (i = 0; i < t.length; i++) { // 复制字符s.data[i] = t.data[i];}s.length = t.length; // 设置字符串长度
}// 判断是否为空串
bool StrEmpty(SequentialString &s) {return s.length == 0;
}// 判断两个串是否相等
bool StrEqual(SequentialString s, SequentialString t) {bool same = true;int i;if (s.length != t.length) { // 检查长度是否相同same = false;} else {for (i = 0; i < s.length; i++) { // 逐个字符比较if (s.data[i] != t.data[i]) {same = false;break;}}}return same;
}// 获取串的长度
int StrLength(SequentialString s) {return s.length;
}// 串的连接
SequentialString Concat(SequentialString s, SequentialString t) {SequentialString str;int i;str.length = s.length + t.length; // 计算新字符串长度for (i = 0; i < s.length; i++) { // 复制第一个串str.data[i] = s.data[i];}for (i = 0; i < t.length; i++) { // 连接第二个串str.data[s.length + i] = t.data[i];}return str;
}// 获取子串
SequentialString SubStr(SequentialString s, int i, int j) {int k;SequentialString str;str.length = 0;if (i <= 0 || j > s.length || j < 0 || i + j - 1 > s.length) { // 检查边界条件return str;}for (k = i - 1; k < i + j - 1; k++) { // 复制子串str.data[k - i + 1] = s.data[k];}str.length = j; // 设置子串长度return str;
}// 子串插入
SequentialString InsertStr(SequentialString s1, SequentialString s2, int i) {int j;SequentialString str;str.length = 0;if (i <= 0 || i > s1.length + 1) { // 检查边界条件return str;}for (j = 0; j < i - 1; j++) { // 复制前缀str.data[j] = s1.data[j];}for (j = 0; j < s2.length; j++) { // 插入子串str.data[j + i - 1] = s2.data[j];}for (j = i - 1; j < s1.length; j++) { // 连接剩余部分str.data[j + s2.length] = s1.data[j];}str.length = s1.length + s2.length; // 更新长度return str;
}// 子串删除
SequentialString DelStr(SequentialString s, int i, int j) {int k;SequentialString str;str.length = 0;if (i <= 0 || j > s.length || i + j > s.length + 1) { // 检查边界条件return str;}for (k = 0; k < i - 1; k++) { // 复制前缀str.data[k] = s.data[k];}for (k = i + j - 1; k < s.length; k++) { // 复制后缀str.data[k - j] = s.data[k];}str.length = s.length - j; // 更新长度return str;
}// 子串替换
SequentialString RepStr(SequentialString s, int i, int j, SequentialString t) {int k;SequentialString str;str.length = 0;if (i <= 0 || j > s.length || i + j - 1 > s.length + 1) { // 检查边界条件return str;}for (k = 0; k < i - 1; k++) { // 复制前缀str.data[k] = s.data[k];}for (k = 0; k < t.length; k++) { // 替换子串str.data[i + k - 1] = t.data[k];}for (k = i + j - 1; k < s.length; k++) { // 连接剩余部分str.data[t.length + k - j] = s.data[k];}str.length = s.length - j + t.length; // 更新长度return str;
}// 输出串
void displayStr(SequentialString s) {int i;for (i = 0; i < s.length; i++) { // 输出每个字符printf("%c", s.data[i]);}printf("\n");
}// 串的比较
int StrCompare(SequentialString s, SequentialString t) {int i;int commonLength;if (s.length < t.length) {commonLength = s.length;} else {commonLength = t.length;}for (i = 0; i < commonLength; i++) { // 逐个字符比较if (s.data[i] > t.data[i]) {return 1;} else if (s.data[i] < t.data[i]) {return -1;}}if (s.length == t.length) {return 0;} else if (s.length > t.length) {return 1;} else {return -1;}
}int main() {SequentialString s, t;char input[MaxSize];// 用户输入第一个串printf("请输入第一个字符串: ");scanf("%s", input);StrAssign(s, input);// 用户输入第二个串printf("请输入第二个字符串: ");scanf("%s", input);StrAssign(t, input);// 显示两个串printf("第一个字符串: ");displayStr(s);printf("第二个字符串: ");displayStr(t);// 检查是否为空串if (StrEmpty(s)) {printf("第一个串为空串。\n");} else {printf("第一个串不为空串。\n");}if (StrEmpty(t)) {printf("第二个串为空串。\n");} else {printf("第二个串不为空串。\n");}// 比较两个串int result = StrCompare(s, t);if (result == 0) {printf("两个串相等。\n");} else if (result < 0) {printf("第一个串小于第二个串。\n");} else {printf("第一个串大于第二个串。\n");}// 计算两个串的长度printf("第一个串的长度为: %d\n", StrLength(s));printf("第二个串的长度为: %d\n", StrLength(t));// 连接两个串SequentialString concatenated = Concat(s, t);printf("连接后的字符串: ");displayStr(concatenated);// 获取子串int start, length;printf("请输入子串起始位置 (1-%d): ", s.length);scanf("%d", &start);printf("请输入子串长度: ");scanf("%d", &length);SequentialString substring = SubStr(s, start, length);printf("子串为: ");displayStr(substring);// 插入子串printf("请输入插入位置 (1-%d): ", StrLength(s) + 1);scanf("%d", &start);SequentialString inserted = InsertStr(s, t, start);printf("插入后的字符串: ");displayStr(inserted);// 删除子串printf("请输入删除起始位置 (1-%d): ", s.length);scanf("%d", &start);printf("请输入删除长度: ");scanf("%d", &length);SequentialString deleted = DelStr(s, start, length);printf("删除后的字符串: ");displayStr(deleted);// 替换子串printf("请输入替换起始位置 (1-%d): ", s.length);scanf("%d", &start);printf("请输入替换长度: ");scanf("%d", &length);SequentialString replaced = RepStr(s, start, length, t);printf("替换后的字符串: ");displayStr(replaced);return 0;
}

4. 使用说明

  1. 编译并运行上述示例程序。
  2. 根据提示输入两个字符串。
  3. 观察并理解各个操作的结果。

5. 总结

通过本文档,您可以了解到顺序串的基本概念和常用操作。使用这些操作,您可以轻松地处理字符串数据,进行各种字符串相关的任务。希望这份指南能够帮助您更好地理解和使用顺序串。

相关文章:

串---顺序串实现

顺序串详解 本文档将详细介绍顺序串的基本概念、实现原理及其在 C 语言中的具体应用。通过本指南&#xff0c;读者将了解如何使用顺序串进行各种字符串操作。 1. 什么是顺序串&#xff1f; 顺序串是一种用于存储字符串的数据结构&#xff0c;它使用一组连续的内存空间来保存…...

吴恩达机器学习WEEK2

COURSE1 WEEK2 多维特征 在线性回归中&#xff0c;往往特征不止一个&#xff0c;而是具有多维特征 例如&#xff0c;在预测房价的例子中&#xff0c;我们知道更多的信息&#xff1a; x 1 x_1 x1​&#xff1a;房屋的面积 x 2 x_2 x2​&#xff1a;卧室的数目 x 3 x_3 x3​&a…...

yield and generator in python

首先&#xff0c;假设大家都对于pytyhon的List comprehension的使用有了一定经验&#xff08;它可以用于list&#xff0c;set&#xff0c;和dict哦&#xff09; 不熟悉的参考介绍&#xff1a; Comprehending Python’s Comprehensions – dbader.org generator generator是哦…...

spring原理(自学第六天)

Aware 接口及 InitializingBean 接口 今天将会学到Aware 接口及 InitializingBean 接口 我们可以先了解他们的作用&#xff1a; 1. Aware 接口用于注入一些与容器相关信息, 例如 a. BeanNameAware 注入 bean 的名字 b. BeanFactoryAware 注入…...

案例分享—国外优秀ui设计作品赏析

国外UI设计创意迭出&#xff0c;融合多元文化元素&#xff0c;以极简风搭配动态交互&#xff0c;打造沉浸式体验&#xff0c;色彩运用大胆前卫&#xff0c;引领界面设计新风尚 同时注重用户体验的深度挖掘&#xff0c;通过个性化定制与智能算法结合&#xff0c;让界面不仅美观且…...

【C++】简约与清晰的编程艺术

C编程的艺术&#xff1a;简约与清晰的实践之道 一、基础之美&#xff1a;基本类型与数据结构的力量二、函数与库类的艺术三、简约与清晰的实践之道 在C这一既古老又充满活力的编程语言世界里&#xff0c;程序员们常常面临着一个重要的选择&#xff1a;是追求代码的极致抽象与封…...

java之WIFI信号模块

开发步骤分为以下几点&#xff1a; 1.在 AndroidManifest 中声明相关权限&#xff08;网络和文件读写权限&#xff09; 声明权限: <uses-permission android:name"android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name"android.…...

Mybatis面试

Mybatis 面试 1、Mybatis 的执行流程是什么&#xff1f; 1、读取MyBatis配置文件&#xff1a;mybatis-config.xml 加载运行环境 和 映射文件 2、构造会话工厂 SqlSessionFactory &#xff08;全局只有一个&#xff09; 3、会话工厂创建SqlSession对象&#xff08;项目与数据…...

Centos 8系统xfs文件系统类型进行扩容缩容 (LVM)

Centos 8系统xfs文件系统类型进行扩容缩容 &#xff08;LVM&#xff09;,xfs分区类型是不支持正常缩容&#xff0c;只能强制缩容 1.磁盘情况&#xff1a;2.缩容home分区1.备份home数据&#xff1a;2.查找使用 /home 的进程&#xff1a;3.终止这些进程&#xff1a;4.卸载 /home …...

C语言基础知识之函数指针和指针函数

函数指针和指针函数 函数指针和指针函数指向函数的指针返回指针值的函数指针函数和函数指针的区别 问题1_1代码1_1结果1_1 函数指针和指针函数 指向函数的指针 用函数指针变量调用函数 可以用指针变量指向整型变量、字符串、数组&#xff0c;也可以指向一个函数。一个…...

【Unity】web gl inputFied 中文输入,同时支持TextMeshInputFied,支持全屏

同时支持TextMeshInputFied&#xff0c;支持全屏。 使用github包【WebGLInput】&#xff1a;https://github.com/kou-yeung/WebGLInput 需要资源的在这里也可以下载 https://download.csdn.net/download/weixin_46472622/89600795 用于unity web gl 中文输入&#xff0c;只需…...

vue3+vite全局引入less变量和函数

需要在vite配置 plugins: [css: {preprocessorOptions: {less: {additionalData: import "./src/styles/variables.module.less"; import "./src/views/Visualization/component/ViewportCom/px2viewport.less";,javascriptEnabled: true}}}, ]多个文件按…...

H81002S 1.7mm网络变压器:BMS汽车蓝牙接收器中的超薄共模电感科技

华强盛导读&#xff1a;在当今这个日新月异的汽车科技领域&#xff0c;每一处细节都蕴含着创新与突破。作为电动汽车心脏的电池管理系统&#xff08;BMS&#xff09;&#xff0c;其高效稳定的运行不仅关乎续航与安全&#xff0c;更是智能化驾驶体验的基石。而在这背后&#xff…...

C语言.回调函数

回调函数 回调函数也是一个函数。与一般函数直接调用区别在于&#xff0c;使用回调函数的过程&#xff0c;是一个函数将另一个函数作为参数调用。而被用来调用的那个函数&#xff0c;就是回调函数。 回调函数就是一个通过函数指针调用的函数。如果你把函数的指针&#xff08;地…...

《从零开始:使用Python构建简单Web爬虫》

前言 随着互联网信息的爆炸性增长&#xff0c;如何高效地获取和处理这些数据变得越来越重要。Web爬虫作为一种自动化工具&#xff0c;可以帮助我们快速抓取所需的网页内容。本文将介绍如何使用Python编写一个简单的Web爬虫&#xff0c;并通过实例演示其基本用法。 准备工作 …...

最新个人免签约支付系统源码|PHP源码 | 码支付系统 | ThinkPHP6框架 | 开源

源码介绍&#xff1a; 这个最新的个人专用免签约支付系统源码&#xff01;是PHP源码写的哦&#xff0c;而且是用ThinkPHP6框架开发的&#xff0c;完全开源的码支付系统。 这个系统适合个人用户使用&#xff0c;作为收款的免签约解决方案。它还加入了监控端&#xff0c;可以拒…...

The Llama 3 Herd of Models 第4部分后训练的全文

Llama 3前三部分包括介绍、总体概述和预训练https://blog.csdn.net/qq_51570094/article/details/140682445?spm=1001.2014.3001.5501 4 Post-Training 后训练 我们通过应用几轮后训练6或将模型与人类反馈对齐来生成对齐的Llama 3模型(Ouyang等人,2022;Rafailov等人,2024)在…...

MongoDB性能调优

文章目录 MongoDB性能调优MongoDB性能不佳原因影响MongoDB性能的因素MongoDB性能监控工具mongostatmongotopProfiler模块db.currentOp() MongoDB性能调优 MongoDB性能不佳原因 慢查询阻塞等待硬件资源不足 1,2通常是因为模型/索引设计不佳导致的 排查思路&#xff1a;按1-2…...

【Qt开发】调试log日志QDebug重定向输出到textEdit等控件(qInstallMessageHandler回调函数)

【Qt开发】调试log日志QDebug重定向输出到textEdit等控件&#xff08;qInstallMessageHandler回调函数&#xff09; 文章目录 Log输出方式qInstallMessageHandler回调函数线程安全textEdit控件附录&#xff1a;C语言到C的入门知识点&#xff08;主要适用于C语言精通到Qt的C开发…...

【JavaEE精炼宝库】 网络编程套接字——UDP业务逻辑 | TCP流套接字编程及业务逻辑实现

文章目录 一、UDP业务逻辑实现二、TCP流套接字编程2.1 API 介绍&#xff1a;2.1.1 ServerSocket&#xff1a;2.1.2 Socket&#xff1a; 2.2 Java流套接字通信模型&#xff1a;2.3 代码示例&#xff1a;2.3.1 TCP Echo Server&#xff1a;2.3.2 TCP Echo Client&#xff1a;2.3.…...

Python|GIF 解析与构建(5):手搓截屏和帧率控制

目录 Python&#xff5c;GIF 解析与构建&#xff08;5&#xff09;&#xff1a;手搓截屏和帧率控制 一、引言 二、技术实现&#xff1a;手搓截屏模块 2.1 核心原理 2.2 代码解析&#xff1a;ScreenshotData类 2.2.1 截图函数&#xff1a;capture_screen 三、技术实现&…...

线程同步:确保多线程程序的安全与高效!

全文目录&#xff1a; 开篇语前序前言第一部分&#xff1a;线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分&#xff1a;synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码&#xff0c;专为学校招生场景量身打造&#xff0c;功能实用且操作便捷。 从技术架构来看&#xff0c;ThinkPHP提供稳定可靠的后台服务&#xff0c;FastAdmin加速开发流程&#xff0c;UniApp则保障小程序在多端有良好的兼…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现&#xff08;两者等价&#xff09;&#xff0c;用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例&#xff1a; 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

Fabric V2.5 通用溯源系统——增加图片上传与下载功能

fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...

回溯算法学习

一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...

七、数据库的完整性

七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...