当前位置:首页 > 通信资讯 > 正文

串的顺序存储函数(C语言顺序存储)

本文实例为大家分享了C语言实现串的顺序存储表示与基本操作代码,供大家参考,具体内容如下

1、串的三种存储表示

串,即:字符串。要注意的是,C语言中是没有字符串数据类型的,而将其作为一种数据结构——“内容受限的线性表”进行实现,并对空串、空格串、串的长度、子串与主串等概念进行了约定【详见 《数据结构(C语言版)》 ,严蔚敏、吴伟民编著

串的存储表示主要分为三种:

【1】顺序存储表示 :使用字符型数组(一块连续的内存存储空间)来存储串的内容,其最大长度已经定义则不可修改;(这也是C语言中初始约定好的一种较为字符串内容的表示方式)

【2】堆分配存储表示:使用malloc和free函数对堆区进行操作,进行堆区内存的动态分配与释放,而这块存储空间就用于存储串的内容;

【3】块链存储表示:即采用链表的形式,通过指针,将位于不同存储空间的多个字符串“碎片”进行连接,“拼凑”成为一个完整的串

在此只介绍第一种,即:串的顺序存储表示。

2、串的顺序存储表示与基本操作

这部分就直接贴代码了

【因为这里是对数组元素的操作,就偷个懒,直接用了C语言string.h头文件中提供的一些库函数,对一些基本操作进行了简单实现。需要详细写代码的部分到串的堆分配实现时候再体现】

2.1 头文件声明

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 /** * 串的顺序存储实现 */ #include <string.h> #define MAXLEN 255 //结构体定义-表示串结构体 typedef struct{ char ch[MAXLEN+1];//存储串内容的字符型数组[+1是为了存储结束标志'\0'] int length;//当前串的长度 }SString; /** * 将字符串T复制为chars */ int StrAssignS(SString* T,char* chars); /** * 获取字符串长度 */ int StrLengthS(SString T); /** * 字符串的判空操作 */ int StrIsEmptyS(SString T); /** * 串连接操作 */ int StrConcatS(SString* T,char* s1,char* s2); /** * 截取子串 */ int SubStringS(SString* T,SString src,int pos,int len); /** * 串清空 */ int ClearStringS(SString* T); /** * 串比较 */ int StrCompareS(SString T1,SString T2);

2.2 函数实现

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 #include "SString.h" /** * 将字符串T复制为chars */ int StrAssignS(SString* T,char* chars){ //清空原始内容 memset(T->ch,0,MAXLEN); T->length=0; //重新赋值为chars strcpy(T->ch,chars); T->length=(int)strlen(chars); /*printf("len=%d\n",strlen(T->ch));*/ return 0; } /** * 字符串的判空操作 */ int StrIsEmptyS(SString T){ return T.length==0; } /** * 获取字符串长度 */ int StrLengthS(SString T){ return T.length; } /** * 串连接操作 */ int StrConcatS(SString* T,char* s1,char* s2){ //辅助变量 char *p; //清空T中的内容 memset(T->ch,0,MAXLEN); T->length=0; //连接字符串 p=strcat(s1,s2); //字符串连接到T中 strcpy(T->ch,p); T->length=(int)strlen(p); return 1; } /** * 截取子串 */ int SubStringS(SString* T,SString src,int pos,int len){ //清空T中的原始内容 memset(T->ch,0,MAXLEN); T->length=0; //获取子串 /** char *strncpy(char *dest, const char *src, size_t n) dest -- 指向用于存储复制内容的目标数组 src -- 要复制的字符串 n -- 要从源中复制的字符数 */ strncpy(T->ch,src.ch+pos,len); //重新设置串的长度 T->length=len; return 1; } /** * 串比较 */ int StrCompareS(SString T1,SString T2){ /* int strcmp(const char *str1, const char *str2) 如果返回值小于 0,则表示 str1 小于 str2 如果返回值大于 0,则表示 str1 大于 str2 如果返回值等于 0,则表示 str1 等于 str2 */ return strcmp(T1.ch,T2.ch); } /** * 串清空 */ int ClearStringS(SString* T){ memset(T->ch,0,MAXLEN); T->length=0; return 1; }

2.3 函数测试

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 #include <stdio.h> #include <stdlib.h> #include "SString.h" int main(int argc,char **argv){ SString str1,str2; //str1.ch="Hello,World!"; StrAssignS(&str1,"Hello,World"); StrAssignS(&str2,"Hello"); printf("len=%d\n",StrLengthS(str1)); //字符串连接 StrConcatS(&str1,"SHello","Hi"); printf("len=%d\n",StrLengthS(str1)); //打印字符串内容 printf("str1=%s\n",str1.ch); printf("str2=%s\n",str2.ch); printf("CompareRes=%d\n",StrCompareS(str1,str2)); //截取子串 SubStringS(&str2,str1,2,3); puts(str1.ch); puts(str2.ch); //清空字符串内容 ClearStringS(&str1); printf("str1's len=%d,str2's len=%d,\nso str1 isEmpty:%d,str2 isEmpty:%d\n",StrLengthS(str1),StrLengthS(str2),StrIsEmptyS(str1),StrIsEmptyS(str2)); return 0; }

贴上测试结果的截图:

串的顺序存储函数(C语言顺序存储)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/weixin_43524214/article/details/120148047

如果您对该产品感兴趣,请填写办理(客服微信:xiaoxiongyidong)

为您推荐:

发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。