串
线性结构:串
串
定义:(String)是由零个或多个字符组成的有限序列,又称字符串。
特点:
- 长度:串中字符的个数,称为串的长度。
- 空串:长度为零的字符串称为空串。
- 空格串:由一个或多个连续空格组成的串称为空格串。
- 串相等:两个串相等,是指两个串的长度相等且对应的字符都相等。
- 子串:串中任意连续的字符组成的子序列称为该串的子串。
- 主串:包含子串的串为该子串的主串。
基本操作:
串的基本操作
int StringAssign(string *S, char chs[]) //生成一个其值等于字符串常量chs的串Svoid StringCopy(string *S1, string *S2) //将串S2复制到串S1
int LengthString(string *S) //求串S的长度
int ShowString(string *S) //打印串S
int StringCompare(string *S1, string *S2) //比较串S1和串S2 ,若S1=S2返回0;若S1>S2,返回1;若S1 < S2,返回-1
int ConcatString(string *S, string *S1, string *S2) //用S返回由S1和S2连接而成的新串
int SubString(string *Sub, string *S, int pos, int len) //用Sub返回串S的第pos个字符起长度为len的子串
int Index(string *S, string *T,int pos) //朴素的模式匹配算法 bf算法
//返回子串T在主串S中第pos个字符之后的位置,若不存在,返回0
串的顺序存储结构:
#define _CRT_SECURE_NO_WARNINGS 1 /*加油!*/ /* * 串:顺序存储结构 */ #include "stdio.h" #include "stdlib.h" #include "stdbool.h" #define Maxsize 255 typedef struct string //顺序串的结构体 { char ch[Maxsize + 1];//从0开始 存储串的一维数组 int len; }str; int i = 0, j = 0; //初始化 进行赋值 int StrAssign(str *s,char chs[]) //生成一个其值等于字符串常量chs的串s { int i = 0; while (chs[i]!= '\0') //循环 将chs的值赋值给s { s->ch[i] = chs[i]; ++i; } s->len = i;// return 0; } //串的复制 void Strcopy(str *s1,str *s2) { for (i = 0;i<s1->len;i++) { s2->ch[i] = s1->ch[i]; } s2->len = s1->len; } //求串的长度 int StrLength(str *s) { return s->len; } //判断串是否为空 bool StrEmpty(str *s) { if (s->len == 0) { return true; } return false; } //打印串 int ShowString(str *s) { if (StrEmpty(s)) { printf("当前串为空!"); return 0; } for (i = 0;i<s->len;i++) { printf("%c", s->ch[i]); } printf("\n"); return 0; } //用s返回由s1和s2连接的新串 int ConcatString(str *s,str *s1,str *s2) { for (i=0;i<s1->len;i++)//赋值s1串 { s->ch[i] = s1->ch[i]; } s->len = s1->len; for (j=0;j<s2->len;j++)//赋值s2串 { s->ch[i] = s2->ch[i]; s->len++; } return 0; } ///用sub返回串S的第pos个字符起长度为len的子串 int SubString(str *sub,str *s,int pos,int len) { //判断一下结束条件 if ((pos<1)||(pos>s->len)||(len<0)||(len > s->len - pos + 1)) { printf("输入有误!\n"); return 0; } j = 0; while(j<len) { sub->ch[j] = s->ch[pos - 1]; ++j; ++pos; } sub->len = len; return 0; } //BF算法 int Index_BF(str *s,str *t,int pos) { int i = pos; int j = 0; if (pos<1||pos>s->len) { printf("输入有误!"); return 0; } while (i<=s->len && j<=t->len) { if (s->ch[i - 1] == t->ch[j]) { ++i; ++j; } else { i = i - j + 1; j = 0; } } if (j == t->len) return i - t->len; else return 0; } int main() { str S; str N; str M; str T; char ch[] = { "hello world" }; char ch1[] = { "hello" }; char ch2[] = { "hello world red" }; char ch3[] = { "red" }; StrAssign(&S, ch); StrAssign(&N, ch1); StrAssign(&M, ch2); printf("S串:"); ShowString(&S); printf("当前S串的长度为%d\n", StrLength(&S)); printf("N串:"); ShowString(&N); printf("当前N串的长度为%d\n", StrLength(&N)); printf("M串:"); ShowString(&M); printf("当前N串的长度为%d\n", StrLength(&M)); StrAssign(&T, ch3); printf("T串:"); ShowString(&T); printf("当前T串的长度为%d\n", StrLength(&T)); printf("BF算法求解模式子串的位置:\n"); printf("(BF暴力模式匹配算法)子串T在主串M中的位置:%d\n", Index_BF(&M, &T, 1)); printf("用sub返回串S的第pos个字符起长度为len的子串:\n"); SubString(&L,&S,7,5); printf("显示S串中第7个字符起长度为5的子串L:"); ShowString(&L); printf("用P返回由s1和s2连接的新串:\n"); ConcatString(&P, &N, &M); printf("显示P返回由S和T连接的新串:"); ShowString(&P); system("pause"); return 0; }
本文来自博客园,作者:咕噜咕噜咚c,转载请注明原文链接:https://www.cnblogs.com/hhhcy/p/16748742.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!