文章标题 c语言中关于串的相关知识以及操作
来源:互联网 发布:防噪音耳塞 知乎 编辑:程序博客网 时间:2024/05/17 07:14
1)串的基本概念
串,即是字符串,由零个或者多个字符组成的有限序列,是数据元素为单个字符的特殊线性表。一般记为:S1='a1a2a3a4a5....an'。
2)串的存储结构:
定长顺序存储结构、堆分配存储结构和块链存储结构三种。
a.*定长顺序存储结构* 定长顺序存储结构是用一组地址连续的存储单元存储串值的字符序列,就是将串定义成字符串数组。数组的名字就是串名。数组的上界预先给出,所以也称为静态存储。存储结构定义如下: #define MAXL 256 typedef unsigned char SString[MAXL+1];//0号单元用于存储串长,串值从1号单元开始放。 另一种是从0号单元开始存储串值。结构定义如下: #define MAXL 60 typedef struct { char str[MAXL]; int length; }SString;此种存储结构有来两个缺点:一是需要预先定义一个串允许的最大长度,当MAXL估计过大的时候串的存储密度就会降低,会浪费较多空间;二是由于限定了串的最大长度,使串的某些运算,比如联接收到一定限制。 b.*堆分配存储结构存储* 它其实也是利用一组地址连续的存储单元存储串值的字符序列,但是存储空间是在程序运行的时候动态分配的。因此可以利用c语言中动态分配函数库中的malloc()来分配空间,还可以利用realloc()增加空间 存储结构定义如下: typedef struct { char *ch; int length; }HString;c.*块链存储结构*是使用链式存数结构存储串,每个节点有data域和next指针域组成。 #define CHUNKSIZE 80 typedef struct Chunk { char ch[CHUNKSIZE]; struct CHunk *next; }Chunk; typedef struct { Chunk *head,*tail; int curlen; }LString;
3)串的相关操作:
1.串赋值算法:
#include<stdio.h>#define MAXL 256typedef unsigned char str[MAXL];void strAssign(str &T, char *chars){ int i = 0; T[0] = 0;//0号单元存储字串长度 for ( i = 0; chars[i]; i++) { T[i + 1] = chars[i];//用字符数组chars给串赋值. } T[0] = i;}void main(){ str T; char chars[] = "abcdefghijk"; strAssign(T, chars); printf("串长是%d\n ", T[0]); printf("赋值后的串是 :"); for (int i = 1; i <= T[0]; i++) { printf("%c", T[i]); }}
2.求子串算法:
#include<stdio.h>#define MAXL 256#define ERROR 0#define OK 1typedef int Status;typedef unsigned char str[MAXL];void strAssign(str &T, char *s)//用字符数组给T赋值{ int i = 0; T[0] = 0; for (; s[i]; i++) T[i + 1] = s[i]; T[0] = i;}Status subString(str &sub, str T, int pos, int len)//用sub返回第 pos个字符起长度为len的子串。{ if (pos<1 || pos>T[0] || len<0 || len>T[0] - pos + 1) return ERROR; for (int i = 1; i <= len; i++) { sub[i] = T[pos + i - 1]; } sub[0] = len;}void main(){ int pos, len; str T, sub; char chars[100]; printf("请输入字符串 "); //scanf_s("%[^\n]", chars, sizeof(chars));//[^\n]只有遇到回车才会停止读入. gets_s(chars);//此处若是使用scanf_s()如上面注释的那样,也是没问题的. strAssign(T, chars); printf("请输入子串开始的位置和长度(中间用逗号隔开) "); scanf_s("%d,%d", &pos, &len); getchar(); if (subString(sub, T, pos, len))//判断是否取子串成功. { printf("从第%d位置开始,长度为%d的子串为 ", pos, len); for (int i = 1; i <= sub[0]; i++) { printf("%c", sub[i]); } printf("\n"); } else printf("求子串失败.....\n");}
3.串比较算法:
#include<stdio.h>#include<stdlib.h>#define OK 1#define ERROR 0#define OVERFLOW -1typedef int Status;//串的堆分配存储表示typedef struct{ char *ch; int length;}HString;Status strAssign(HString &s, char *chars){ int i; char *c = chars; for (i = 0; *c; i++, c++);//求chars的长度 if (!i) { s.ch = NULL; s.length = 0; } else { s.ch = (char*)malloc(i*sizeof(char)); if (!(s.ch))exit(OVERFLOW); for (int j = 0; j < i; j++) { s.ch[j] = chars[j]; } s.length = i; } return OK;}Status strCompareTo(HString a, HString b)//若a<b,则则返回值<0,若a>b,则返回值>0,若a=b,则返回值=0;{ int i = 0; for (int i = 0; i < a.length&&b.length; i++) { if (a.ch[i] != b.ch[i]) return (a.ch[i] - b.ch[i]); } return (a.length - b.length);}void main(){ HString Sa, Sb; char char_a[100], char_b[100]; printf("请输入字符串a:"); gets_s(char_a); strAssign(Sa, char_a); printf("请输入字符串b:"); gets_s(char_b); strAssign(Sb, char_b); if (strCompareTo(Sa, Sb) == 0) printf("串 %s 等于串 %s", char_a, char_b);//此处是char_a,char_b,不能是Sa,Sb. if (strCompareTo(Sa, Sb) < 0) printf("串 %s 小于串 %s", char_a,char_b); if (strCompareTo(Sa, Sb)>0) printf("串 %s 等于串 %s", char_a, char_b);}
4.串联接算法
#include <stdio.h>#define TRUE 1#define FALSE 0#define MAXL 255typedef int Status;typedef unsigned char SString[MAXL + 1];void strAssign(SString &T, char *s)//用字符数组s给串T赋值{ T[0] = 0; int i = 0; for (; s[i]; i++) { T[i + 1] = s[i]; } T[0] = i;}//定义了一个int型变量uncut,用于判断是否会被截断。//uncun = TRUE时未被截断,uncut=FALSE时被截断。Status connect(SString &T, SString S1, SString S2){ int uncut, i; if (S1[0] + S2[0] <= MAXL)//未截断,注意0号单元存储的是串长. { for (i = 1; i <= S1[0]; i++) T[i] = S1[i]; for (i = 1; i < S2[0]; i++) T[S1[0] + i] = S2[i]; T[0] = S1[0] + S2[0]; uncut = TRUE; } else if (S1[0] < MAXL)//S2被截断 { for (i = 1; i <= S1[0]; i++) T[i] = S1[i]; for (i = 1; i <= MAXL - S1[0]; i++)//注意此时的循环条件. T[S1[0] + i] = S2[i]; T[0] = MAXL; uncut = FALSE; } else//S1,S2均被截断。 { for (i = 1; i <= MAXL; i++) T[i] = S1[i]; uncut = FALSE; } return uncut;}void main(){ SString S1, S2, T; char char_s1[100], char_s2[100]; printf("请输入字符串S1:"); gets_s(char_s1); printf("请输入字符串S2:"); gets_s(char_s2); strAssign(S1, char_s1); strAssign(S2, char_s2); if (connect(T, S1, S2)) { printf("S1= %s 和 S2= %s 联接过程中未被截断,连接后的串是: ", char_s1, char_s2); for (int i = 1; i <= T[0]; i++) printf("%c", T[i]); } else { printf("S1= %s 和 S2= %s 联接过程中被截断,连接后的串是: ", char_s1, char_s2); for (int i = 1; i <= T[0]; i++) printf("%c", T[i]); }}
5.串的模式匹配算法
#include<stdio.h>#define MAXL 255#define OK 1#define OVERFLOW -1typedef unsigned char SString[MAXL+1];void strAssign(SString &T, char *s)//用字符数组s给串T赋值.{ int i = 0; T[0] = 0;//0号单元存储串长. for (; s[i]; i++) { T[i + 1] = s[i]; } T[0] = i;}int index(SString T, SString S, int pos)//返回子串S在主串T第pos个字符开始匹配的位置,若不存在,则返回0;{ int i = pos,j=1; while (i <= T[0] && j <= S[0]) { if (T[i] == S[j]) { i++; j++; } else { i = i - j + 2; j = 1; } } if (j > S[0]) return i - S[0]; else return 0;}void main(){ int pos; SString T, S; char char_a[100], char_b[100]; printf("请输入主串A:"); gets_s(char_a); printf("%s\n", char_a); printf("请输入主串B:"); gets_s(char_b); printf("%s\n", char_b); strAssign(T, char_a); strAssign(S, char_b); printf("赋值成功!\n"); pos = index(T, S, 1); if (pos) { printf("主串 T=%s 的子串 S=%s 在第%d个位置开始匹配。",char_a,char_b,pos); } else printf("主串 T=%s 和子串 S=%s 不匹配",char_a,char_b);}
以上就是串相关知识以及一些简单操作,代码处理平台是vs2013。初来乍到,多多关照,有什么写的不对的,欢迎指正。
0 0
- 文章标题 c语言中关于串的相关知识以及操作
- c语言关于文件的相关操作
- c语言中的文件操作的相关函数(知识)
- Effective c++(笔记) 中关于构造函数、析构函数以及赋值操作符的知识
- c语言中关于隐式类型转换的相关说明以及用法
- 网图的邻接矩阵存储以及相关操作 C语言
- 图的邻接表存储以及相关操作 C语言
- 二叉排序树的建立以及相关操作 C语言
- 文章标题C语言实现单链表之基础操作
- C语言中关于时间的操作
- C语言关于线性表的相关操作
- 关于C语言相关操作符的个人剖析
- C语言相关知识
- C语言指针相关知识理解以及总结
- c语言 void*的相关知识
- C语言中几个与临时文件操作相关的函数
- C语言中单向链表的相关操作
- 关于C语言中scanf()的相关问题
- 容斥+二进制UVA 11806
- Java面向对象之二-构造方法
- POJ2155
- 【C#】C#删除Excel整行,更新单元格内容
- java 获取程序执行时间
- 文章标题 c语言中关于串的相关知识以及操作
- 生命如花
- WebView加载网页-进度显示-网络上传图片并压缩
- 两个队列模拟栈
- php模拟post上传图片
- HDU_1114【完全背包】
- hadoop HA启动时 两个namenode节点都是standby,解决办法
- php课堂笔记
- Ubuntu安装flashplayer