首页 > 代码库 > 匹配主串与子串的过程

匹配主串与子串的过程

我们思考下算法,然后设计函数。假设主串 s1=nowamagic.net,子串sub=magic。我们要寻找sub在s1中的首个出现位置。

  1. 设i用于主串s1中当前位置下标值,j用于子串sub中当前位置下标值。伯爵娱乐城
  2. 首先我们比较s1[1]与sub[1],如果相同的话,可能子串就开始了。
  3. 如果不相等,那么子串仍然是从sub[1]开始,而主串s1则以s1[2]与其比较。
  4. 如果连续出现5次或以上匹配,那么就找到子串了,此时的j必然大于子串长度sub[0]。
/* 返回子串T在主串S中第pos个字符之后的位置。若不存在,则函数返回值为0。 *//* 其中,T非空,1≤pos≤StrLength(S)。 */int Index(String S, String T, int pos){	int i = pos;	/* i用于主串S中当前位置下标值,若pos不为1,则从pos位置开始匹配 */	int j = 1;				/* j用于子串T中当前位置下标值 */	while (i <= S[0] && j <= T[0]) /* 若i小于S的长度并且j小于T的长度时,循环继续 */	{		if (S[i] == T[j]) 	/* 两字母相等则继续 */      	{			++i;         	++j;      	}      	else 				/* 指针后退重新开始匹配 */      	{         	i = i-j+2;		/* i退回到上次匹配首位的下一位 */         	j = 1; 			/* j退回到子串T的首位 */      	}	}	if (j > T[0])		return i-T[0];	else		return 0;}

测试执行代码为:

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;

程序运行结果:

1.StrAssign 生成串2.StrLength 求串长3.StrCompare 串比较4.Concat 串连接5.SubString 求子串6.Index 求子串位置0.退出请选择你的操作:1串s1为:nowamagic.net6主串s1为: nowamagic.net子串sub为: magics1的第5个字母起和sub第一次匹配

完整的程序在后面部分会给出,就不必每篇都贴了。

匹配主串与子串的过程