C语言:串匹配的一般方法

/*
	串的一般的模式匹配:
	思想:从主串S的第pos个位置起,和子串的第一个字符比较,若相等,则逐个比较后面的字符;
	若不相等,则从主串的第pos+1个位置起,再重新和子串比较
*/

# include<stdio.h>
# include<string.h>
# include<malloc.h>

int index(char * S, char * T, int pos);  //求从第pos位置起,子串T在主串S中的索引
char * subString( char *S, int i, int len_t);  //主串S,从索引i开始,长度为len_t的子串
bool compare(char * c, char * T);  //比较两字符串
void strPrint(char * ch);  //打印字符串

int main(void)
{
	char * c1 = "bbabcabcacbab";
	char * c2 = "bca";

	printf("主串s:");
	strPrint(c1);
	printf("子串t:");
	strPrint(c2);

	//从第1个位置起,在主串c1中搜索子串c2
	//如果找到c2,则返回c2首字符在c1中的下标,如果没有找到,则返回-1
	printf("从主串的第2个位置起开始:\n");
	int i = index(c1, c2, 2);

	printf("字符串匹配成功,主串匹配索引 i = %d\n", i);

	return 0;
}

//在主串S中,从第pos个位置开始,搜索子串T
int index(char * S, char * T, int pos)
{
	int len_s = strlen(S);  //两字符串的长度
	int len_t = strlen(T);

	printf("len_s = %d\n", len_s);
	printf("len_t = %d\n", len_t);

	char * c;

	int i;

	//i为主串S的下标
	for(i = pos - 1; i < (len_s - len_t + 1); i++)
	{
		//获取下标从i开始,长度为len_t的子串
		c = subString(S, i, len_t);

		//判断c是否等于T
		if(compare(c, T))
			return i;
	}

	return -1;
}

//获取下标从i开始,长度为len_t的子串
char * subString( char * S, int i, int len_t)
{ 
	char * c = (char *)malloc(sizeof(char) * (len_t+1));

	int j;
	int k = 0;

	for(j = i; j < i + len_t; j++)
	{
		c[k] = S[j];
		k++;
	}
	c[k] = '\0'; //***子串的最后一个字符为字符串的结束符

	strPrint(c);

	return c;
}

//比较两字符串
bool compare(char * c, char * T)
{
	int i;
	int len_c = strlen(c);
	int len_T = strlen(T);

	if(len_c != len_T)
	{
		return false;
	}
	else
	{
		//字符逐个比较
		for(i = 0; i < len_c; i++)
		{
			if(c[i] != T[i])
				return false;
		}

		return true;
	}
}

//打印字符串
void strPrint(char * ch)
{
	int len = strlen(ch);

	int i;
	for(i = 0; i < len; i++)
	{
		printf("%c", ch[i]);
	}
	printf("\n");
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值