int main() { SString s; StrAssign(s,"acabaabaabcacaabc"); SString t; StrAssign(t,"abaabcac"); StrPrint(s); StrPrint(t); int next[10]; get_next(t,next); SString v; StrAssign(v,"xy"); if(Replace(s,t,v)) StrPrint(s); if(Reverse(v)) StrPrint(v); int cnt[10]; if(Count(s,v,cnt)){ StrPrint(v); for(int i=0; i<=v[0]; i++) printf("%d ",cnt[i]); } return 0; }
Status Replace(SString& S, SString T, SString V){ //入口断言:S,T,V存在 //操作结果:将S中出现的所有不重复的T都替换为V int k = Index(S, T, 1); if(k){ SString suffix; StrAssign(suffix,""); int n = T[0], m = S[0]; while(k){ printf("%d\n",k); SString temp; SubString(temp, S, 1, k-1); //当前第一个T的前缀 StrPrint(temp); if(Concat(suffix, temp)){ StrPrint(suffix); Concat(suffix, V); //追加上V StrPrint(suffix); m -= (k-1)+n; //处理掉上一组后剩余的后缀长度 SubString(temp, S, k+n, m); StrCopy(S, temp); //S被截断为尚未处理的后缀 k = Index(S, T, 1); }else return OVERFLOW; //S空间不足 } if(Concat(suffix, S)){ StrCopy(S, suffix); return OK; }else return OVERFLOW; } else return OK; //T未出现过 }
int main() { StrPtr s, t, v; StrAssign(s, "aaaabb"); StrPrint(s); StrAssign(t, "ccdd"); if(Concat(v,s,t)) StrPrint(v); if(SubString(v,s,2,4)) StrPrint(v); return 0; }
void main() { int i; char c, *p = "God bye!", *q = "God luck!"; HString t, s, r; InitString(t); InitString(s); InitString(r); StrAssign(t, p); printf("串t为"); StrPrint(t); printf("串长为%d,串空否?%d(1:空 0:否)\n", StrLength(t), StrEmpty(t)); StrAssign(s, q); printf("串s为"); StrPrint(s); i = StrCompare(s, t); if (i < 0) c = '<'; else if (i == 0) c = '='; else c = '>'; printf("串s%c串t\n", c); Concat(r, t, s); printf("串t连接串s产生的串r为"); StrPrint(r); StrAssign(s, "oo"); printf("串s为"); StrPrint(s); StrAssign(t, "o"); printf("串t为"); StrPrint(t); Replace(r, t, s); printf("把串r中和串t相同的子串用串s代替后,串r为"); StrPrint(r); ClearString(s); printf("串s清空后,串长为%d,空否?%d(1:空 0:否)\n", StrLength(s), StrEmpty(s)); SubString(s, r, 6, 4); printf("串s为从串r的第6个字符起的4个字符,长度为%d,串s为", s.length); StrPrint(s); StrCopy(t, r); printf("由串r复制得串t,串t为"); StrPrint(t); StrInsert(t, 6, s); printf("在串t的第6个字符前插入串s后,串t为"); StrPrint(t); StrDelete(t, 1, 5); printf("从串t的第1个字符起删除5个字符后,串t为"); StrPrint(t); printf("%d是从串t的第1个字符起,和串s相同的第1个子串的位置\n", Index(t, s, 1)); printf("%d是从串t的第2个字符起,和串s相同的第1个子串的位置\n", Index(t, s, 2)); DestroyString(t); }
void test() { char ch[2][255]; int i=0,pos=1; SString S[2],T; for(i=0;i<2;i++) { printf("ÊäÈë×Ö·û´®%d:",i+1); scanf("%s",ch[i]); StrAssign(S[i],ch[i]); } for(i=0;i<2;i++) { printf("Êä³ö×Ö·û´®%d:",i+1); StrPrint(S[i]); printf("×Ö·ûÊÇ·ñΪ¿Õ%d(1-·Ç 0-¿Õ),×Ö·û´®³¤¶È:%d\n",!StrEmpty(S[i]),StrLength(S[i])); } printf("---Á¬½Ó´®--\n"); Concat(T,S[0],S[1]); printf("Á¬½Óºó:"); StrPrint(T); printf("---Çó×Ó´®---\n"); printf("ÊäÈë×Ö´®:"); scanf("%s",ch[0]); printf("ÊäÈë²éÕÒλÖÃ:"); scanf("%d",&pos); StrAssign(S[0],ch[0]); i=Index(T,S[0],pos); printf("²éÕÒµ½µÄλÖÃ:%d\n",i); printf("---Ìæ´ú---\n"); printf("ÊäÈëÌæ´úµÄ×Ó´®:"); scanf("%s",ch[1]); printf("Ìæ»»%sºó:",ch[0]); StrAssign(S[1],ch[1]); Replace(T,S[0],S[1]); StrPrint(T); printf("±È½Ï×Ö·û´®:S%d%cS%d\n",1,StrCompare(S[0],S[1])>0?'>':StrCompare(S[0],S[1])<0?'<':'=',2); StrCopy(S[0],S[1]); printf("---¸´Öƺó---\n"); for(i=0;i<2;i++) { printf("Êä³ö×Ö·û´®%d:",i+1); StrPrint(S[i]); printf("×Ö·ûÊÇ·ñΪ¿Õ%d(1-·Ç 0-¿Õ),×Ö·û´®³¤¶È:%d\n",!StrEmpty(S[i]),StrLength(S[i])); } printf("±È½Ï×Ö·û´®:S%d%cS%d\n",1,StrCompare(S[0],S[1])>0?'>':StrCompare(S[0],S[1])<0?'<':'=',2); }
void main() { int i; char c,*p="God bye!",*q="God luck!"; HString t,s,r; InitString(&t); /* HString类型必需初始化 */ InitString(&s); InitString(&r); StrAssign(&t,p); printf("串t为: "); StrPrint(t); printf("串长为%d 串空否?%d(1:空 0:否)\n",StrLength(t),StrEmpty(t)); StrAssign(&s,q); printf("串s为: "); StrPrint(s); i=StrCompare(s,t); if(i<0) c='<'; else if(i==0) c='='; else c='>'; printf("串s%c串t\n",c); Concat(&r,t,s); printf("串t联接串s产生的串r为: "); StrPrint(r); StrAssign(&s,"oo"); printf("串s为: "); StrPrint(s); StrAssign(&t,"o"); printf("串t为: "); StrPrint(t); Replace(&r,t,s); printf("把串r中和串t相同的子串用串s代替后,串r为:\n"); StrPrint(r); ClearString(&s); printf("串s清空后,串长为%d 空否?%d(1:空 0:否)\n",StrLength(s),StrEmpty(s)); SubString(&s,r,6,4); printf("串s为从串r的第6个字符起的4个字符,长度为%d 串s为: ",s.length); StrPrint(s); StrCopy(&t,r); printf("复制串t为串r,串t为: "); StrPrint(t); StrInsert(&t,6,s); printf("在串t的第6个字符前插入串s后,串t为: "); StrPrint(t); StrDelete(&t,1,5); printf("从串t的第1个字符起删除5个字符后,串t为: "); StrPrint(t); printf("%d是从串t的第1个字符起,和串s相同的第1个子串的位置\n",Index(t,s,1)); printf("%d是从串t的第2个字符起,和串s相同的第1个子串的位置\n",Index(t,s,2)); }
void Search() { // 查找字符串 int i,k,f=1; // f为继续查找标志 char b[2]; HString s; printf("请输入待查找的字符串: "); scanf("%s%*c",str); InitString(s); StrAssign(s,str); for(i=0;i<n&&f;i++) // 逐行查找 { k=1; // 由每行第1个字符起查找 while(k) { k=Index(T[i],s,k); // 由本行的第k个字符开始查找 if(k) // 找到 { printf("第%d行: ",i+1); StrPrint(T[i]); printf("第%d个字符处找到。继续查找吗(Y/N)? ",k); gets(b); if(b[0]!='Y'&&b[0]!='y') // 中断查找 { f=0; break; } else k++; } } } if(f) printf("没找到\n"); }
int main() { char cmd[MAXCMD]={0}; // Commande int ret; // Le retour de la fonctions String S[MAXLEN]={0},*p; //S:String p:Pointeur à String char tmp[MAXLEN]={0}; printf("***********************************************\n"); printf("------ Première implementaion du String ------\n"); printf("La maxime longeur du string: %d\n",MAXLEN); printf("Options de commandes: \n"); printf("0: StrAssign \n"); printf("1: StrLength \n"); printf("2: StrPrint \n"); printf("#: Quit \n"); printf("***********************************************\n"); while (1) { scanf("%s",cmd);// Lire la commande if (cmd[0]=='#') break; // Quiter if (!CharsCompare(cmd,"0\0")) { scanf("%s",tmp); // La valeur initial p=&S[0]; ret=StrAssign(p,tmp); } else if (!CharsCompare(cmd,"1\0")) { p=&S[0]; ret=StrLength(*p); printf("length is %d.\n",ret); ret=OK; } else if (!CharsCompare(cmd,"2\0")) { p=&S[0]; ret=StrPrint(*p); } else { printf("The Command is Error.\n"); } if (ret==OK) printf("This Command is Successful.\n\n"); else if (ret==ERROR) printf("The input data is Error.\n\n"); else if (ret==OVERFLOW) printf("OVERFLOW.\n\n"); } return 0; }
void List() { // 显示文本内容 int i; for(i=0;i<n;i++) { printf("%d: ",i+1); StrPrint(T[i]); } }
void ALGO4_1_main() { int i,j,*p; SString s1,s2; // 以教科书中图4.5为例 StrAssign(s1,"acabaabaabcacaabc"); printf("主串为: "); StrPrint(s1); StrAssign(s2,"abaabcac"); printf("子串为: "); StrPrint(s2); i=StrLength(s2); p=(int*)malloc((i+1)*sizeof(int)); // 生成s2的next数组 get_next(s2,p); printf("子串的next函数为: "); for(j=1;j<=i;j++) printf("%d ",*(p+j)); printf("\n"); i=Index_KMP(s1,s2,1,p); if(i) printf("主串和子串在第%d个字符处首次匹配\n",i); else printf("主串和子串匹配不成功\n"); }
void Modify() { // 修改行 int i; printf("请输入待修改的行号: "); scanf("%d%*c",&i); if(i>0&&i<=n) // 行号合法 { printf("%d: ",i); StrPrint(T[i-1]); printf("请输入新内容: "); gets(str); StrAssign(T[i-1],str); } else printf("行号超出范围\n"); }
void Replace() { // 替换字符串 int i,k,f=1; // f为继续替换标志 char b[2]; HString s,t; printf("请输入待替换的字符串: "); scanf("%s%*c",str); InitString(s); StrAssign(s,str); printf("替换为: "); scanf("%s%*c",str); InitString(t); StrAssign(t,str); for(i=0;i<n&&f;i++) // 逐行查找、替换 { k=1; // 由每行第1个字符起查找 while(k) { k=Index(T[i],s,k); // 由本行的第k个字符开始查找 if(k) // 找到 { printf("第%d行: ",i+1); StrPrint(T[i]); printf("第%d个字符处找到。是否替换(Y/N)? ",k); gets(b); if(b[0]=='Y'||b[0]=='y') { StrDelete(T[i],k,StrLength(s)); StrInsert(T[i],k,t); } printf("继续替换吗(Y/N)?"); gets(b); if(b[0]!='Y'&&b[0]!='y') // 中断查找、替换 { f=0; break; } else k+=StrLength(t); } } } if(f) printf("没找到\n"); }
int main() { int i,j; Status k; char s; String t,s1,s2; printf("请输入串s1: "); k=StrAssign(s1,"abcd"); if(!k) { printf("串长超过MAXSIZE(=%d)\n",MAXSIZE); exit(0); } printf("串长为%d 串空否?%d(1:是 0:否)\n",StrLength(s1),StrEmpty(s1)); StrCopy(s2,s1); printf("拷贝s1生成的串为: "); StrPrint(s2); printf("请输入串s2: "); k=StrAssign(s2,"efghijk"); if(!k) { printf("串长超过MAXSIZE(%d)\n",MAXSIZE); exit(0); } i=StrCompare(s1,s2); if(i<0) s='<'; else if(i==0) s='='; else s='>'; printf("串s1%c串s2\n",s); k=Concat(t,s1,s2); printf("串s1联接串s2得到的串t为: "); StrPrint(t); if(k==FALSE) printf("串t有截断\n"); ClearString(s1); printf("清为空串后,串s1为: "); StrPrint(s1); printf("串长为%d 串空否?%d(1:是 0:否)\n",StrLength(s1),StrEmpty(s1)); printf("求串t的子串,请输入子串的起始位置,子串长度: "); i=2; j=3; printf("%d,%d \n",i,j); k=SubString(s2,t,i,j); if(k) { printf("子串s2为: "); StrPrint(s2); } printf("从串t的第pos个字符起,删除len个字符,请输入pos,len: "); i=4; j=2; printf("%d,%d \n",i,j); StrDelete(t,i,j); printf("删除后的串t为: "); StrPrint(t); i=StrLength(s2)/2; StrInsert(s2,i,t); printf("在串s2的第%d个字符之前插入串t后,串s2为:\n",i); StrPrint(s2); i=Index(s2,t,1); printf("s2的第%d个字母起和t第一次匹配\n",i); SubString(t,s2,1,1); printf("串t为:"); StrPrint(t); Concat(s1,t,t); printf("串s1为:"); StrPrint(s1); Replace(s2,t,s1); printf("用串s1取代串s2中和串t相同的不重叠的串后,串s2为: "); StrPrint(s2); return 0; }
int main() { int i, j, opp, pos; char s, str; String t,s1,s2,sub; Status k; printf("\n1.StrAssign 生成串 \n2.StrLength 求串长 \n3.StrCompare 串比较 "); printf("\n4.Concat 串连接 \n5.SubString 求子串 \n6.Index 求子串位置"); printf("\n7.StrInsert 子串插入 \n8.StrDelete 子串删除 \n9.Replace 子串替换"); printf("\n0.退出 \n请选择你的操作:\n"); while(opp != '0') { scanf("%d",&opp); switch(opp) { case 1: k=StrAssign(s1,"nowamagic.net"); if(!k) { printf("串长超过MAXSIZE(=%d)\n",MAXSIZE); exit(0); } printf("串s1为:"); StrPrint(s1); printf("\n"); break; case 2: printf("串s1长为%d \n",StrLength(s1)); break; case 3: k=StrAssign(s2,"google.com"); if(!k) { printf("串长超过MAXSIZE(%d)\n",MAXSIZE); exit(0); } printf("串s2为:"); StrPrint(s2); printf("\n"); i=StrCompare(s1,s2); if(i < 0) s=' < '; else if(i==0) s='='; else s='>'; printf("串s1%c串s2\n",s); break; case 4: Concat(t,s1,s2); StrPrint(t); break; case 5: printf("求串s1的子串,请输入子串的起始位置: "); scanf("%d", &i); printf("请输入子串的长度: "); scanf("%d", &j); printf("起始位置:%d,子串长度:%d\n", i, j); k=SubString(sub,s1,i,j); if(k) { printf("子串sub为: "); StrPrint(sub); } break; case 6: printf("主串s1为: "); StrPrint(s1); k=StrAssign(sub,"magic"); printf("子串sub为: "); StrPrint(sub); i=Index(s1,sub,1); printf("s1的第%d个字母起和sub第一次匹配\n",i); break; case 7: printf("主串s1为: "); StrPrint(s1); k=StrAssign(sub,"lol"); printf("子串sub为: "); StrPrint(sub); printf("请输入要插入的位置: "); scanf("%d", &pos); StrInsert(s1,pos,sub); StrPrint(s1); break; case 8: printf("从串s1的第pos个字符起,删除len个字符,请输入pos: \n"); scanf("%d", &i); printf("再输入len: \n"); scanf("%d", &j); StrDelete(s1,i,j); StrPrint(s1); break; case 9: printf("主串s1为: "); StrPrint(s1); StrAssign(t,"a"); printf("串t为:"); StrPrint(t); StrAssign(sub,"aa"); printf("串sub为:"); StrPrint(sub); printf("用串s2取代串s1中和串t相同的不重叠的串后,串s1为: "); Replace(s1,t,sub); StrPrint(s1); break; case 0: exit(0); } } }
int main() { int i, *p; String s1, s2; StrAssign(s1, "ababaaaba"); StrAssign(s2, "ababaaaba"); Index_KMP(s1, s2, 0); StrAssign(s1, "abcdex"); printf("子串为: "); StrPrint(s1); i = StrLength(s1); p = (int*)malloc((i + 1)*sizeof(int)); get_next(s1, p); printf("Next为: "); NextPrint(p, StrLength(s1)); printf("\n"); StrAssign(s1, "abcabx"); printf("子串为: "); StrPrint(s1); i = StrLength(s1); p = (int*)malloc((i + 1)*sizeof(int)); get_next(s1, p); printf("Next为: "); NextPrint(p, StrLength(s1)); printf("\n"); StrAssign(s1, "ababaaaba"); printf("子串为: "); StrPrint(s1); i = StrLength(s1); p = (int*)malloc((i + 1)*sizeof(int)); get_next(s1, p); printf("Next为: "); NextPrint(p, StrLength(s1)); printf("\n"); StrAssign(s1, "aaaaaaaab"); printf("子串为: "); StrPrint(s1); i = StrLength(s1); p = (int*)malloc((i + 1)*sizeof(int)); get_next(s1, p); printf("Next为: "); NextPrint(p, StrLength(s1)); printf("\n"); StrAssign(s1, "ababaaaba"); printf(" 子串为: "); StrPrint(s1); i = StrLength(s1); p = (int*)malloc((i + 1)*sizeof(int)); get_next(s1, p); printf(" Next为: "); NextPrint(p, StrLength(s1)); get_nextval(s1, p); printf("NextVal为: "); NextPrint(p, StrLength(s1)); printf("\n"); StrAssign(s1, "aaaaaaaab"); printf(" 子串为: "); StrPrint(s1); i = StrLength(s1); p = (int*)malloc((i + 1)*sizeof(int)); get_next(s1, p); printf(" Next为: "); NextPrint(p, StrLength(s1)); get_nextval(s1, p); printf("NextVal为: "); NextPrint(p, StrLength(s1)); printf("\n"); StrAssign(s1, "00000000000000000000000000000000000000000000000001"); printf("主串为: "); StrPrint(s1); StrAssign(s2, "0000000001"); printf("子串为: "); StrPrint(s2); printf("\n"); printf("主串和子串在第%d个字符处首次匹配(朴素模式匹配算法)\n", Index(s1, s2, 1)); printf("主串和子串在第%d个字符处首次匹配(KMP算法) \n", Index_KMP(s1, s2, 1)); printf("主串和子串在第%d个字符处首次匹配(KMP改良算法) \n", Index_KMP1(s1, s2, 1)); return 0; }
void main() { char *s1="ABCDEFGHI",*s2="12345",*s3="",*s4="asd#tr",*s5="ABCD"; Status k; int pos,len; LString t1,t2,t3,t4; InitString(&t1); InitString(&t2); printf("初始化串t1后,串t1空否?%d(1:空 0:否) 串长=%d\n",StrEmpty(t1),StrLength(t1)); k=StrAssign(&t1,s3); if(k==OK) { printf("串t1为: "); StrPrint(t1); } else printf("出错\n"); /* 不能生成空串 */ k=StrAssign(&t1,s4); if(k==OK) { printf("串t1为: "); StrPrint(t1); } else printf("出错\n"); /* 不能生成含有变量blank所代表的字符的串 */ k=StrAssign(&t1,s1); if(k==OK) { printf("串t1为: "); StrPrint(t1); } else printf("出错\n"); printf("串t1空否?%d(1:空 0:否) 串长=%d\n",StrEmpty(t1),StrLength(t1)); StrAssign(&t2,s2); printf("串t2为: "); StrPrint(t2); StrCopy(&t3,t1); printf("由串t1拷贝得到串t3,串t3为: "); StrPrint(t3); InitString(&t4); StrAssign(&t4,s5); printf("串t4为: "); StrPrint(t4); Replace(&t3,t4,t2); printf("用t2取代串t3中的t4串后,串t3为: "); StrPrint(t3); ClearString(&t1); printf("清空串t1后,串t1空否?%d(1:空 0:否) 串长=%d\n",StrEmpty(t1),StrLength(t1)); Concat(&t1,t2,t3); printf("串t1(=t2+t3)为: "); StrPrint(t1); Zip(&t1); printf("去除不必要的占位符后,串t1为: "); StrPrint(t1); pos=Index(t1,t3,1); printf("pos=%d\n",pos); printf("在串t1的第pos个字符之前插入串t2,请输入pos: "); scanf("%d",&pos); k=StrInsert(&t1,pos,t2); if(k) { printf("插入串t2后,串t1为: "); StrPrint(t1); } else printf("插入失败!\n"); printf("求从t1的第pos个字符起,长度为len的子串t2,请输入pos,len: "); scanf("%d,%d",&pos,&len); SubString(&t2,t1,pos,len); printf("串t2为: "); StrPrint(t2); printf("StrCompare(t1,t2)=%d\n",StrCompare(t1,t2)); printf("删除串t1中的子字符串:从第pos个字符起删除len个字符。请输入pos,len:"); scanf("%d,%d",&pos,&len); k=StrDelete(&t1,pos,len); if(k) { printf("从第%d位置起删除%d个元素后串t1为:",pos,len); StrPrint(t1); } }