/*
串的一般的模式匹配:
思想:从主串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");
}
C语言:串匹配的一般方法
最新推荐文章于 2023-11-29 12:05:24 发布