#include<stdio.h> #include<stdlib.h> #include<malloc.h> #include<string.h> #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define OVERFLOW -1 typedef int Status; #define MaxStrSize 255 //大小根据用户需要自己定义 typedef struct { char ch[MaxStrSize+1]; int length; }SString; //定义顺序串类型 int PartPosition(SString s1,SString s2,int k) {/*从第K个位置开始扫描s1,当其元素值与s2的第一个元素 想等时,判断它们之后的元素是否依次想等,直到s2结 束为止。若都相同,则返回当前下标值,否则继续上述 过程,直到s1扫描完为止。 */ int i,j; i = k-1; j = 0; //扫描s1的下标,数组下标从0开始 while(i<s1.length && j<s2.length) { if(s1.ch[i] == s2.ch[j]) { i++; j++; //继续使下标移向下一个字符 } else { i=i-j+1; //使i得下标回溯到原位置的下一位置。 j=0; //使j指向s2的第一个字符,再重新比较 } } if(j>=s2.length) return i-j+1; //表示s1中存在s2,返回其起始下标 else return -1; //表示s1中不存在s2,返回-1 } void main() { int i,j,k; SString S,T; int wz[50]; //wz数组记录子串出现的位置 i=0; printf("请输入主字符串:\n"); gets(S.ch); //读入主串S printf("请输入模式串:\n"); gets(T.ch); S.length = strlen(S.ch); T.length = strlen(T.ch); k = 1; while(k<=S.length) { j = PartPosition(S,T,k); if(j<0) break; else { i++; wz[i]=j; //不能写成j+1 k=j+T.length; } } printf("\n"); printf("%d",i); printf("\n"); if(i==1) { printf("没有检索到需要的子串:"); } else { printf("子串%s在主串中出现%d次\n",T.ch,i); printf("%d次匹配位置分别为:",i); for(k=1;k<=i;k++) printf("%4d",wz[k]); } system("pause"); printf("\n"); }