基于C语言的字符串暴力匹配算法(包含完整代码)

1.图解:

1.1 开始匹配时,主串标识i指向主串第一个字符,匹配串标识j指向匹配串第一个字符

 1.2 两标识指向的字符相同时,两标识都想后移动一位,直到指向的字符不同为止

 1.3 主串标识返回初始时的下一个位置,匹配串标识返回匹配串的第一个位置,继续向后匹配

 1.4 继续匹配,直到主串的字符全部匹配完毕,或者匹配串匹配到符合要求的字符串时停止匹配。

 

 2.代码

2.1定义结构体

typedef struct String
{
	char *data;//由于c语言没有专门的字符串数据类型,因此用指针代替字符串 
	int len;//代表此字符串的长度 
}String;

2.2初始化

String *initString()
{
	String *s = (String *)malloc(sizeof(String));//申请空间 
	s->data = NULL;//最开始字符串为空 
	s->len = 0;//长度为空 
	return s;
}

2.3往结构体中写入字符串

void  stringAssign(String *s,char *data)//第一个是结构体,第二个是要写入的字符串 
{
	if(s->data)//首先判断此结构体中是否有字符,有的话清空结构体中的字符 
		free(s->data);
	int len = 0,i;//len表示字符串长度 
	char *temp = data;//将字符串首地址记录下来	
	while(*temp)//计算此字符串有多长 
	{
		len++;
		temp++;
	}
	if(len==0)//长度为0,则没有传入任何字符 
	{
		s->data = NULL;
		s->len = 0;
	}
	else
	{
		temp = data;//重新记录字符串的首地址 
		s->len = len;//将字符串的长度写入结构体 
		s->data = (char *)malloc(sizeof(char)*(len+1));//申请空间,+1是为了多存一个结束符 
		for(i=0;i<len;i++,temp++)//根据长度变量逐个向结构体中写入字符 
		{
			s->data[i] = *temp;//*是解引用,*temp表示temp指向的元素(字符) 
		}
	}
}

2.4暴力匹配

void forceMetch(String *master,String *sub)//第一个是主串,第二个是匹配串 
{
	int i = 0,j = 0;//定义两个变量,一个指向主串,一个指向匹配串 
	while(master->data[i]&&sub->data[j])//结束条件是匹配到主串末尾并且匹配串也到末尾 
	{
		if(master->data[i]==sub->data[j])//两个结构体中的字符串的每个字符都要比对,相同则比较下一个 
		{
			i++;
			j++;
		}
		else//字符不同,主串标识i回到起始位置的第二个位置继续匹配,匹配串标识j回到初始位置 
		{
			i = i-j+1;
			j = 0;
		}	
	}
	if(j==sub->len)//判断是否匹配成功(匹配串中的所有字符全部匹配完毕) 
		printf("匹配成功!\n");
	else
		printf("匹配失败!\n");
}

2.5输出结构体中的字符串

void printString(String *s)
{
	int i;
	for(i=0;i<s->len;i++)//根据结构体中的长度变量len确定循环次数 
		printf("%c ",s->data[i]);//按位输出结构体中的字符
	printf("\n"); 
}

2.6主函数验证

int main()
{
	String *s = initString();//初始化 
	String *r = initString();
	stringAssign(s,"HELLO");//验证写入字符串 
	printString(s);//验证遍历输出 
	stringAssign(r,"LLO");//验证暴力匹配算法 
	printString(r);
	forceMetch(s,r);
	return 0;
}

---------------------------------------全部代码如下-------------------------------------

#include <stdio.h>
#include <stdlib.h>

/*定义结构体*/
typedef struct String
{
    char *data;//由于c语言没有专门的字符串数据类型,因此用指针代替字符串 
    int len;//代表此字符串的长度 
}String;
/*初始化*/
String *initString()
{
    String *s = (String *)malloc(sizeof(String));//申请空间 
    s->data = NULL;//最开始字符串为空 
    s->len = 0;//长度为空 
    return s;
}
/*往结构体中写入字符串*/
void  stringAssign(String *s,char *data)//第一个是结构体,第二个是要写入的字符串 
{
    if(s->data)//首先判断此结构体中是否有字符,有的话清空结构体中的字符 
        free(s->data);
    int len = 0,i;//len表示字符串长度 
    char *temp = data;//将字符串首地址记录下来    
    while(*temp)//计算此字符串有多长 
    {
        len++;
        temp++;
    }
    if(len==0)//长度为0,则没有传入任何字符 
    {
        s->data = NULL;
        s->len = 0;
    }
    else
    {
        temp = data;//重新记录字符串的首地址 
        s->len = len;//将字符串的长度写入结构体 
        s->data = (char *)malloc(sizeof(char)*(len+1));//申请空间,+1是为了多存一个结束符 
        for(i=0;i<len;i++,temp++)//根据长度变量逐个向结构体中写入字符 
        {
            s->data[i] = *temp;//*是解引用,*temp表示temp指向的元素(字符) 
        }
    }
}
/*暴力匹配*/
void forceMetch(String *master,String *sub)//第一个是主串,第二个是匹配串 
{
    int i = 0,j = 0;//定义两个变量,一个指向主串,一个指向匹配串 
    while(master->data[i]&&sub->data[j])//结束条件是匹配到主串末尾并且匹配串也到末尾 
    {
        if(master->data[i]==sub->data[j])//两个结构体中的字符串的每个字符都要比对,相同则比较下一个 
        {
            i++;
            j++;
        }
        else//字符不同,主串标识i回到起始位置的第二个位置继续匹配,匹配串标识j回到初始位置 
        {
            i = i-j+1;
            j = 0;
        }    
    }
    if(j==sub->len)//判断是否匹配成功(匹配串中的所有字符全部匹配完毕) 
        printf("匹配成功!\n");
    else
        printf("匹配失败!\n");
}
/*输出结构体中的字符串*/
void printString(String *s)
{
    int i;
    for(i=0;i<s->len;i++)//根据结构体中的长度变量len确定循环次数 
        printf("%c ",s->data[i]);//按位输出结构体中的字符
    printf("\n"); 
}
int main()
{
    String *s = initString();//初始化 
    String *r = initString();
    stringAssign(s,"HELLO");//验证写入字符串 
    printString(s);//验证遍历输出 
    stringAssign(r,"LLO");//验证暴力匹配算法 
    printString(r);
    forceMetch(s,r);
    return 0;
}

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值