串,模式匹配Index

来源:互联网 发布:不要网络的钢琴游戏 编辑:程序博客网 时间:2024/06/08 05:19

1.串的顺序存储实现

#include<stdio.h>#include<stdlib.h>#include<string.h>#define MAXSIZE 40#define OK 1#define Status inttypedef char SString[MAXSIZE + 1];//0号单元存放串的长度Status StrAssign(SString T, char *chars)//生成一个其值等于chars的子串{int i;if (strlen(chars)>MAXSIZE) return 0;else{T[0] = strlen(chars);for (i = 1; i <= T[0]; i++)T[i] = *(chars + i - 1);return OK;}}int StrLength(SString S){return S[0];}int StrCompare(SString S, SString T){int i;for (i = 1; i <= S[0] && i <= T[0]; i++)if (S[i] != T[i])return S[i] - T[i];return 0;}Status Concat(SString T,SString S1, SString S2){int i;if (S1[0] + S2[0] <= MAXSIZE){//未截断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];}else//截断{printf("截断S2\n");for (i = 1; i <= S1[0]; i++)T[i] = S1[i];for (i = 1; i <= MAXSIZE - S1[0]; i++)T[S1[0] + i] = S2[i];T[0] = MAXSIZE;}return OK;}Status SubString(SString Sub, SString S, int pos, int len){//用Sub返回串的第pos个字符起长度为len的子串int i;if (pos<1 || pos>S[0] || len<0 || len>S[0] - pos + 1){printf("pos或len有误\n"); return 0;}for (i = 1; i <= len; i++)Sub[i] = S[pos + i - 1];Sub[0] = len;return OK;}int Index(SString S, SString T, int pos){//返回子串T在主串S中第pos个字符之后的位置。若不存在, 则函数返回值为0int i = pos;// i用于主串S中当前位置下标值,若pos不为1,则从pos位置开始匹配 int j = 1;// j用于子串T中当前位置下标值while (i <= S[0] && j <= T[0]){if (S[i] == T[j]){//两字母相等则继续i++; j++;}else{i = i - j + 1+1;// i退回到上次匹配首位的下一位 //i-j+1回到0位,因为0位为长度,移到下标为1处j = 1;}}if (j > T[0])//j现在等于T[0]+1return (i - T[0]);//i-(T[0]+1)+1,移到下标1处else return 0;}void Outline(SString S){int i;for (i = 1; i <= S[0]; i++)printf("%c", S[i]);printf("\n");}int main(){int cord;SString S, chars,s1,s2,T;do{printf("\n\n1.StrAssign 生成串\n");printf("2.StrLength 求串长\n");printf("3.StrCompare 串比较\n");printf("4.Concat 串连接\n");printf("5.输出串\n");printf("6.SubString 求子串\n");printf("7.Index 模式匹配\n");scanf("%d", &cord);switch (cord){case 1:{  printf("输入要生成的串\n");  scanf("%s", chars);  if (StrAssign(S, chars))  printf("成功\n");}break;case 2:{  printf("串长为%d", StrLength(S));}break;case 3:{  int i;  printf("输入要比较的串:\n");  scanf("%s", chars);  i = StrCompare(S, chars);  if (i > 0)printf("串S>串chars\n");  else if (i < 0)printf("串S<串chars\n");  else printf("串S=串chars\n");}break;case 4:{  printf("输入要连接的串S1:\n");  scanf("%s", chars);  StrAssign(s1, chars);  printf("输入要连接的串S1:\n");  scanf("%s", chars);  StrAssign(s2, chars);  Concat(T, s1, s2);  printf("连接后的新串为:\n");  Outline(T);}break;case 5:Outline(S); break;case 6:{  int pos, len;  printf("输入子串的起始位置和子串的长度\n");  scanf("%d %d", &pos, &len);  SubString(T, S, pos, len);  printf("子串为:\n");  Outline(T);}break;case 7:{  int pos;  printf("输入pos \n");  scanf("%d", &pos);  printf("输入子串\n");  scanf("%s", chars);  StrAssign(T, chars);  printf("S的第%d个字母起第一次匹配\n",Index(S, T, pos));}break;}} while (cord<9);return 0;}


1 0
原创粉丝点击