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;
}