一、串基本操作——定长顺序存储
类似于线性表的顺序存储结构,用一组地址连续的存储单元存储串值的字符序列,该结构,按预定义的大小,为每个定义的串变量分配一个固定长度的存储区
#include <stdio.h>
#include <malloc.h>
int getLength(char *str)
{
int len=0;
while(str[len]!='\0')
{
len++;
}
//len--;
return len;
}
int strCompare(char *str1,char *str2)
{
int i=0;
if(str1==NULL||str2==NULL)
exit(0);
while(str1[i]==str2[i]&&str1!='\0'&&str2!='\0')
{
++i;
}
return (int)(str1[i]-str2[i]);
}
void strConcat(char *str,char *str1,char *str2)
{
int i;
int m=0;
// if(str!=NULL)
// str=NULL;
for(i=0;i<getLength(str1);i++)
{
str[m++]=str1[i];
}
for(i=0;i<getLength(str2);i++)
{
str[m++]=str2[i];
str[m]='\0';
}
}
void SubString(char *str,char *str1,int pos,int len)
{
int i;
// if(pos<1||pos>getLength(&str1)||len=0||len>getLength(&str1)-pos+1)
// printf("error");
//str=NULL;
//j=pos;
for(i=0;i<len-1;i++,pos++)
{
str[i]=str1[pos];
}
str[i]='\0';
}
int main()
{
int len;
int compare;
char str[200];
char str3[200];
char str1[]="hbabbass";
char str2[]="adsdsaas";
//get len
len=getLength(str1);
printf("%d",len);
printf("\n");
//compare str
compare=strCompare(str1,str2);
printf("%d",compare);
printf("\n");
//concat str
strConcat(str,str1,str2);
printf("%s",str);
printf("\n");
//substring
SubString(str3,str1,2,3);
printf("%s\n",str3);
return 0;
}
二、串基本操作——堆分配存储结构
顺序存储,动态分配(长度不定)
#include <stdio.h>
#include <malloc.h>
typedef struct{
char *ch;
int length;
}HString;
void Init(HString *T)
{
T->length=0;
T->ch=NULL;
}
int StrAssign(HString *T,char *chars){
int i,j;
char *c;
if(T->ch)
free(T->ch);
for(i=0,c=chars;c[i]!='\0';)
{
i++;
} //chars长度
if(!i)
{
T->ch=NULL;
T->length=0;
}
else
{
T->ch=(char *)malloc(i*sizeof(char));
if(!(T->ch))
exit(0);
for(j=0;j<i;j++)
T->ch[j]=chars[j];
T->length=i;
}
return 1;
}
int Getlength(HString S)
{
return S.length;
}
//若S>T则返回值大于0
int Compare(HString S,HString T)
{
int i;
for(i=0;i<S.length&&i<T.length;i++)
{
if(S.ch[i]!=T.ch[i])
return S.ch[i]-T.ch[i];
}
return S.length-T.length;
}
void Concat(HString S,HString T,HString *M)
{
int i,j=0;
// j=T.length;
if(M->ch)
free(M->ch);
//if(!(M->ch=(HString*)malloc(S.length+T.length)*sizeof(char)))
// exit(0);
M->ch=(char *)malloc((S.length+T.length)*sizeof(char));
for(i=0;i<S.length;i++)
{
M->ch[j++]=S.ch[i];
}
for(i=0;i<T.length;i++)
{
M->ch[j++]=T.ch[i];
M->ch[j]='\0';
}
}
void SubString(HString *str,HString *S,int pos,int len)
{
int i;
// j=pos;
if(str->ch)
free(str->ch);
if(!len)
{
str->ch=NULL;
str->length=0;
}
else{
str->ch=(char *)malloc(len*sizeof(char));
for(i=0;i<len;i++,pos++)
{
str->ch[i]=S->ch[pos];
}
}
}
int main()
{
int i;
int len;
HString S;
HString T;
HString M;
char *c;
char *a="sssSSA";
char *r="asSASAS";
Init(&S);
Init(&T);
Init(&M);
StrAssign(&S,a);
StrAssign(&T,r);
i=Compare(S,T);
printf("%d",i);
printf("\n");
len=Getlength(S);
printf("%d",len);
printf("\n");
Concat(S,T,&M);
printf("%s\n",M);
SubString(&M,&S,1,3);
printf("%s\n",M);
return 0;
}
三、串模式匹配(KMP算法)
#include <stdio.h>
#include <string.h>
typedef struct{
int length;
char *str;
}SString;
void get_next(SString T,int *next)
{
int i=1;
int j=0;
next[1]=0;
while(i<T.length)
{
if(j==0||T.str[i]==T.str[j])
{
++i;
++j;
next[i]=j;
}
else{
j=next[j];
}
}
}
int Index_kmp(SString S,SString T,int pos)
{
int i=pos;
int j=1;
int count=0;
int next[255];
get_next(T,next);
while(i<=S.length)
{
//i=pos;
if(j==0||S.str[i]==T.str[j])
{
++i;
++j;
}
else{
j=next[j];
}
if(j==T.length+1)
{
count++;
j=next[j-2];//为了让j能够回到第一个字母位,但不能直接j=1,因为会失去一次i++的机会(j=0的时候),这样会无法记录某些字符
// j=1;
i--;
}
}
return count;
}
int main()
{
SString S,T;
int m;
char *str1=" ababaaba";
S.str=str1;
S.length=strlen(str1)-1;
char *str2=" aba";
// S.length=strlen(str1)-1;
//T.length=strlen(str2)-1;
//S.str=str1;
T.str=str2;
T.length=strlen(str2)-1;
m=Index_kmp(S,T,0);
printf("%d",m);
/*if(m==0){
printf("error");
}
else{
printf("success");
}*/
return 0;
}