1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 #define maxsize 20 5 typedef struct string{ 6 char ch[maxsize+1]; 7 int length; 8 }seqString; 9 10 //初始化字符串 11 void creatstring(seqString *s,char cts[]) 12 { 13 int i=0; 14 if(strlen(cts)>maxsize) 15 { 16 printf("串空间不足以容纳输入字符串! "); 17 } 18 19 while(cts[i] != ' ') 20 { 21 s->ch[i]=cts[i]; 22 i++; 23 } 24 s->length=strlen(cts); 25 printf("字符串长度为:%d ",s->length); 26 } 27 //打印字符串 28 void printstring(seqString s) 29 { 30 int i; 31 printf("当前主串为:"); 32 for(i=0;i<s.length;i++) 33 { 34 if(s.ch[i]==' ') 35 break; 36 else 37 printf("%c",s.ch[i]); 38 } 39 printf(" "); 40 } 41 //连接两个字符串 42 int concat(seqString *s,seqString *t) 43 { 44 int i,m; 45 if(maxsize>s->length+t->length) 46 { 47 for(i=0;i<t->length;i++) 48 { 49 s->ch[i+s->length]=t->ch[i]; 50 } 51 s->length=s->length + t->length; 52 s->ch[s->length]=' '; 53 printf("是否连接成功:连接成功! "); 54 printf("连接后的字符串如下: "); 55 for(i=0;i<s->length;i++) 56 printf("%c",s->ch[i]); 57 printf(" "); 58 printf("连接后字符串长度为:%d ",s->length); 59 return 1; 60 } 61 else if(s->length<maxsize) 62 { 63 m=maxsize-s->length; 64 for(i=0;i<m;i++) 65 { 66 s->ch[s->length+i]=t->ch[i]; 67 } 68 s->length=maxsize; 69 s->ch[maxsize]=' '; 70 printf("是否连接成功:部分连接成功! "); 71 printf("连接后的字符串如下: "); 72 for(i=0;i<maxsize;i++) 73 printf("%c",s->ch[i]); 74 printf(" "); 75 return 1; 76 } 77 else 78 printf("连接失败,串空间不足以连接! "); 79 return 0; 80 } 81 //子串的模式匹配 82 int Find_BF(seqString *s,char p[]) 83 { 84 int i,j,k; 85 for(i=0;i<s->length-strlen(p);i++) 86 { 87 for(k=i,j=0;j<strlen(p);k++,j++) 88 { 89 if(s->ch[k] != p[j]) 90 { 91 printf("第%d次匹配失败!尝试第%d次! ",i+1,i+2); 92 break; 93 } 94 else 95 continue; 96 } 97 if(j==strlen(p)) 98 { 99 printf("第%d次匹配成功! ",i+1); 100 printf("该子串在主串的第一个元素的位置为:%d ",i+1); 101 return i; 102 } 103 } 104 } 105 //判断两个字符串是否相等 106 int comparestring(seqString s,seqString t) 107 { 108 int i,n; 109 if(s.length>t.length) 110 n=s.length; 111 else 112 n=t.length; 113 for(i=0;i<n;i++) 114 { 115 if(s.ch[i]>t.ch[i]) 116 { 117 printf("字符串比较:前者字符串大于后者字符串! "); 118 return 1; 119 } 120 else if(s.ch[i]<t.ch[i]) 121 { 122 printf("字符串比较:前者字符串小于后者字符串! "); 123 return -1; 124 } 125 else 126 continue; 127 } 128 if(i==n) 129 printf("字符串比较:两个字符串相等! "); 130 } 131 //求子串 132 void substring(seqString *s,int x,int y,char b[]) 133 { 134 int i; 135 for(i=x-1;i<=y;i++) 136 { 137 b[i-x+1]=s->ch[i]; 138 } 139 printf("第%d个位置开始的%d个字符的子串如下: ",x,y); 140 printf("%s ",b); 141 } 142 int main() 143 { 144 system("color b1"); 145 int i,n,n1; 146 int id,longth; 147 seqString S,T; 148 149 printf("请输入字符串S的字符串长度(<20):"); 150 scanf("%d",&n); 151 char c[n]; 152 printf("请为字符串S赋值:"); 153 scanf("%s",&c); 154 creatstring(&S,c); 155 printstring(S); 156 157 printf("请输入字符串T的字符串长度(<20):"); 158 scanf("%d",&n1); 159 char c1[n1]; 160 printf("请为字符串T赋值:"); 161 scanf("%s",&c1); 162 creatstring(&T,c1); 163 printstring(T); 164 165 printf(" "); 166 comparestring(S,T); 167 168 concat(&S,&T); 169 printstring(S); 170 171 printf("请您在下方输入当前主串的任意子串,我们接下来将为您进行子串的模式匹配! "); 172 char c2[maxsize]; 173 scanf("%s",&c2); 174 Find_BF(&S,c2); 175 176 printf("请输入您要从何处开始的位置,以及子串的长度:"); 177 scanf("%d%d",&id,&longth); 178 char c3[maxsize]; 179 substring(&S,id,longth,c3); 180 return 0; 181 }
运行结果如下:
字符串大小比较的算法如下: