字符串(简称串),可以将其看作是种特殊的线性表,其特殊性在于线性表的数据元素的类型总是字符性,字符串的数据对象约束为字符集。 串是由0个或多个字符组成的有限序列。一般记作:s = “s1 s2 s3 …. sn”,,其中,s是串名,用双引号括起来的字符序列称为串的值,si(1<=i <= n)称为串的元素,可以是字母,数字或其他字符,是构成串的基本单位,字符的个数n称为串的长度. 1.串的定义:串是由零个或多个组成的有序队列。 2.串的长度:串中字符的数目称为串的长度。 3.空串:由零个字符组成的串叫做空串,空串不包括任何字符,其长度为零。 4.子串:串中任意个连续的字符组成的子序列称为该串的子串,空串是任何串的子串。 5.主串:包含子串的串相应的称为主串。 串的表示: 串有两种表示形式:顺序存储表示和链式存储表示。 顺序存储表示:串的顺序存储结构简称为顺序串,顺序串中的字符序列被顺序地存放在一组连续的存储单元中,主要有三种实现顺序串的方式。 接下来实现的代码是顺序存储,带串长的实现: str.h #pragma once #define SIZE 20 typedef struct Str { char elem[SIZE];//elem数组用来存放串的元素 int length;//定义一个串长度 }Str; void StrAssign(Str *s, const char *chars);//初始化串 void StrCpy(Str*s, Str*t);//拷贝串 int Getlength(Str *s);//获取串的长度 void Clear(Str *s);//清空串s bool Inset(Str *s,int pos,Str *t);//在串s的pos位置插入串t void Show(Str *s) ;//打印串 int BF(Str *s,Str *sub,int pos);//在串s里找第一个串sub,并返回串sub的第一个元素的下标 bool DeletePos(Str* s,int pos,int len);//在串中的pos位置开始删除len长度个元素 bool Delete(Str *s,int pos,Str *t);//在串中的pos位置开始删除串t bool Replace(Str *s,Str *t,Str *v,int pos);//用v替换从pos位置开始的第一个t bool RepIaceAll(Str *s,Str *t,Str *v);//在串s中查找到串t并用串v替换12345678910111213141516171819 这里的串和字符串的区别就是字符串会以“\n”终止符来判定字符串的长度,串中我们给length值就用来直接记录串的长度。 str.c #include"str.h" #include<stdio.h> #include<string.h> #include<stdlib.h> #include<assert.h> void StrAssign(Str *s, const char *chars)//初始化串 { assert(s != NULL); int len = strlen(chars); /*if(s->length<len) { return; }*/ s->length = len; for(int i = 0;i<len;i++) { s->elem[i] = chars[i]; } } void StrCpy(Str*s, Str*t)//拷贝串 { for(int i = 0;i<t->length;i++) { s->elem[i] = t->elem[i]; } s->length = t->length; } int Getlength(Str *s)//获取串的长度 { return s->length ; } void Clear(Str *s)//清空串s { s->length = 0; } bool SubStr(Str *sub,Str *s,int pos,int len)//空白字符不拷贝 { if(pos < 0 || len < 1||pos >=s->length||pos+len>s->length-1) { return false; } for(int i = pos;i<pos+len;i++) { sub->elem[i-pos] = s->elem[i]; } sub->length = len; return true; } bool Inset(Str *s,int pos,Str *t)//在串s的pos位置插入串t { assert(s!=NULL); assert(t!=NULL); if(pos<0||pos>s->length||pos+t->length>SIZE) { return false; } for(int i = s->length-1;i>=pos;i--) { s->elem[i+t->length] = s->elem[i]; } for(int j = 0;j<t->length;j++) { s->elem[j+pos] = t->elem[j]; } s->length +=t->length; return true; } int BF(Str *s,Str *sub,int pos)//在串s里找第一个串sub,并返回串sub的第一个元素的下标 { if(pos<0||pos>s->length) { return -1; } int i = pos; int j = 0; int lens = s->length; int lensub = sub->length; while (i < lens && j < lensub) { if (s->elem[i] == sub->elem[j]) { i++; j++; } else { i = i - j + 1; j = 0; } } if (j >= lensub) { return i - j; } else return -1; } bool DeletePos(Str* s,int pos,int len)//从pos位置开始删除len个长度 { assert(s!=NULL); if(pos<0||pos+len>s->length||len<0) { return false; } //for(int i = pos;i<len+pos;i++) for(int i = pos;i<s->length-len;i++) { s->elem[i] = s->elem[i+len]; } s->length -= len; return true; } bool Delete(Str *s,int pos,Str *t)//在串中的pos位置开始删除串t { assert(s!=NULL); assert(t!=NULL); if(pos<0||pos>s->length||t->length>s->length) { return false; } int index = BF(s,t,pos); if(index < 0) { return false; } return DeletePos(s,index,t->length); } bool Replace(Str *s,Str *t,Str *v,int pos)//用v替换从pos位置开始的第一个t { assert(s!=NULL); assert(t!=NULL); assert(v!=NULL); int index = BF(s,t,pos); if(index < 0) { return false; } DeletePos(s,index,t->length); return Inset(s,index,v); } bool RepIaceAll(Str *s,Str *t,Str *v)//在串s中查找到串t并用串v替换 { assert(s!=NULL); assert(t!=NULL); assert(v!=NULL); while(Replace(s,t,v,0)); return true; } void Show(Str *s) //打印 { for(int i=0;i<Getlength(s);i++) { printf("%c",s->elem[i]); } printf("\n"); } int main() { Str s; char *s1 = "abcdecdfcd"; StrAssign(&s, s1); Show(&s); Str t; char *t1 = "cd"; StrAssign(&t, t1); Show(&t); /* Inset(&s, 2, &t); Show(&s); Inset(&s, 7, &t); Show(&s);*/ /*int index = BF(&s,&t,0); printf("index = %d\n",index);*/ /*DeletePos(&s,3,2); Show(&s);*/ /*Str v; char *v1 = "zkr"; StrAssign(&v, v1); Show(&v); Replace(&s,&t,&v,0); Show(&s);*/ Str v; char *v1 = "zkr"; StrAssign(&v, v1); Show(&v); RepIaceAll(&s,&t,&v); Show(&s); system("pause"); return 0; }
#include<stdio.h> #define maxsize 100 typedef struct{ char A[maxsize]; int n; }SeqString; void Assign(SeqString &L,char B[]){ int i=0; while(B[i]!='\0'){ L.A[i]=B[i]; i++; } L.n=i; } void DisqStr(SeqString &L){ printf("L.B字符串为:"); for(int i=0;i<L.n;i++){ printf("%c",L.A[i]); } printf("\n"); } void Strlength(SeqString &L){ printf("字符串L.A的长度为:%d\n",L.n); } int concat(SeqString &L,char C[]){ int i=0,j; while(C[i]!='\0'){ i++; } for(j=0;j<i;j++){ L.A[j+L.n]=C[j]; } printf("将串C连接到L.A后得到的字符串为:%s\n",L.A); return i; } void StrEqual(SeqString &L,char C[],int i){ int k=0,a; a=L.n>=i?L.n:i; printf("比较L.A和B的字符串大小!(L.A等于C输出0,L.A大于C输出1,L.A小于C输出-1)\n"); for(int j=0;j<a;j++){ if(L.A[j]==C[j]){ k++; }else if(L.A[j]>C[j]){ printf("1\n"); break; }else { printf("-1\n"); break; } } if(k==a){ printf("0\n"); } } void InsStr(SeqString &L,int n,int m){ int i; printf("L.A字符串第%d个位置开始的第%d个字符为:",n,m); for(i=n-1;i<n+m-1;i++){ printf("%c",L.A[i]); } printf("\n"); } void DelStr(SeqString &L,int n,int m){ int i; L.n=L.n-m; for(i=n;i<=L.n;i++){ L.A[i-1]=L.A[i+m-1]; } printf("删除第%d个位置的%d个字符之后组成新的字符串为:",n,m); for(i=0;i<L.n;i++){ printf("%c",L.A[i]); } } void InStr(SeqString &L,int n,int m,char C[]){ int a[L.n-n+1]; for(int i=0;i<L.n-n+1;i++){ a[i]=L.A[i+n-1]; } for(int i=0;i<m;i++){ L.A[i+n-1]=C[i]; } for(int i=0;i<L.n-n+1;i++){ L.A[n+m-1+i]=a[i]; } L.n=L.n+m; printf("将C插在L.A的第%d个位置构成的字符串为:",n); for(int i=0;i<L.n;i++){ printf("%c",L.A[i]); } printf("\n"); } void Find (SeqString &L,char D[]){ int n=0,i,j,k; while(D[n]!='\0'){ n++ ; } for(i=0;i<L.n-n;i++){ for(j=0,k=i;j<n;j++,k++){ if(D[j]!=L.A[k]){ break; } } if(j==n){ printf("D是L.A字符串中从第%d位置到第%d的位置的字符串:\n",i+1,i+n); } } return; } int main(){ int i,n,m,a,b,k; char B[5],C[]="abcdefg",D[4]="cde"; SeqString L; printf("请输入一个最大长度为5的字符串:"); gets(B); Assign(L,B); DisqStr(L); Strlength(L); i=concat(L,C); StrEqual(L,C,i); printf("请输入要查找从第几个位置开始到后面的第几个字符:"); scanf("%d %d",&n,&m); InsStr(L,n,m); printf("请输入在第几个位置插入字符串C:"); scanf("%d",&k); InStr(L,k,i,C); printf("请查找字符串D在L.A字符串中的位置:\n"); Find(L,D); printf("请输入要删除第几个位置开始的几个字符:"); scanf("%d %d",&a,&b); DelStr(L,a,b); return 0; } 复制代码
#include<stdio.h> #include<stdlib.h> #define M 100 typedef struct{ char ch[M]; int n; }Str; void Assign(Str &L,char A[]){ int i=0; while(A[i]!='\0'){ L.ch[i]=A[i]; i++; } L.n=i; } void DisqStr(Str &L){ printf("字符串A为:"); for(int i=0;i<L.n;i++){ printf("%c",L.ch[i]); } printf("\n"); } void StrCopy(Str &L,char B[]){ int i; for(i= 0;i<L.n;i++){ L.B[i]=L.ch[i]; } printf("B字符串为:"); for(int i=0;i<L.n;i++){ printf("%c",L.B[i]); } printf("\n"); } int concat(Str &L,char C[]){ int i=0; while (i<L.n){ C[i]=L.ch[i]; i++; } int j = 0; while (j<L.n) { C[j+L.n]=L.B[j]; j++; } printf("将串C连接到L.A后得到的字符串为:%s\n",C[j+L.n]); return i; } void Strlength(Str &L){ printf("字符串A的长度为:%d\n",L.n); printf("字符串B的长度为:%d\n",L.n); } void StrEqual(Str &L,char B[],int i){ int k=0,a; a=L.n>=i?L.n:i; printf("比较L.A和B的字符串大小!(L.A等于B输出0,L.A大于B输出1,L.A小于B输出-1)\n"); for(int j=0;j<a;j++){ if(L.A[j]==B[j]){ k++; }else if(L.A[j]>B[j]){ printf("1\n"); break; }else { printf("-1\n"); break; } } if(k==a){ printf("0\n"); } } void InsStr(Str &L,int n,int m){ int i; printf("A字符串第%d个位置开始的第%d个字符为:",n,m); for(i=n-1;i<n+m-1;i++){ printf("%c",L.ch[i]); } printf("\n"); } void Find (Str &L,char D[]){ int n=0,i,j,k; while(D[n]!='\0'){ n++ ; } for(i=0;i<L.n-n;i++){ for(j=0,k=i;j<n;j++,k++){ if(D[j]!=L.A[k]){ break; } } if(j==n){ printf("D是L.A字符串中从第%d位置到第%d的位置的字符串:\n",i+1,i+n); } } return; } int main(){ int i,n,m,a,b,k; char A[5],C[]="abcdefg",D[4]="cde"; Str L; printf("请输入一个最大长度为5的字符串:"); gets(A); Assign(L,A); DisqStr(L); Strlength(L); i=concat(L,C); StrEqual(L,B,i); printf("请输入要查找从第几个位置开始到后面的第几个字符:"); scanf("%d %d",&n,&m); InsStr(L,n,m); printf("请输入在第几个位置插入字符串C:"); scanf("%d",&k); InStr(L,k,i,C); printf("请查找字符串D在L.A字符串中的位置:\n"); Find(L,D); printf("请输入要删除第几个位置开始的几个字符:"); scanf("%d %d",&a,&b); DelStr(L,a,b); return 0; }