字符串匹配(简单版本)
前言
对两段不定长的字符串进行匹配
一、定义String结构和初始化
typedef struct String { //定义String结构
char* data; //data数据域,char型
int len; //记录string的长度
}String;
String* initString() //初始化String
{
String* string = (String*)malloc(sizeof(String));
string->data = NULL; //先把string指向NULL
string->len = 0; //len赋值为0
return string;
}
二、字符串匹配
1.对输入字符串进行保存和记录长度
代码如下(示例):
void assignString(String* string, char* data) //对string的data和len进行赋值
{
int len = 0; //记录当前的长度
char* temp = data; //temp指向data的字符串
if (string->data) //如果data没有数据就释放掉
{
free(string->data); //释放掉data
}
while (*temp) //如果temp有值的话
{
len++; //长度++
temp++; //temp地址++
}
if (len == 0) //如果长度为0
{
string->len = 0; //长度赋值为0
string->data = NULL; //data指向NULL
}
else
{
temp = data; //temp重新指向data
string->len = len; //记录长度
string->data = (char*)malloc(sizeof(char) * (len+1) );//因为输入的字符串是不定长的,所以重新储存空间
for (int i = 0; i < len; i++, temp++) //循环不仅是i,同时对temp地址自增
{
string->data[i] = *temp; //一个个保存temp的字符
}
}
}
2.对两段不定长的字符串进行匹配
代码如下(示例):
void forceString(String* master, String* sub) //字符串匹配
{
int i = 0; /*前指针*/
int j = 0; /*后指针*/
while (i < master->len && j < sub->len) //需要同时满足i、j都不能超过两个字符串的长度
{
if (master->data[i] == sub->data[j]) //当字符匹配
{
i++; //前指针++
j++; //后指针++
}
else
{
i = i - j + 1; //这里前指针指向的值确实是这样算出来的
//这里各位还是自己进行DEBUG一下就理解了
j = 0; //j归零是为了进行下一次的字符串匹配
}
}
if (j == sub->len) //当j等于第二个字符串的长度即为配对成功
{
printf("匹配成功\n");
}
else
{
printf("匹配不成功\n");
}
}
3.测试代码
代码如下(示例):
#include<stdio.h>
#include<stdlib.h>
typedef struct String { //定义String结构
char* data; //data数据域,char型
int len; //记录string的长度
}String;
String* initString() //初始化String
{
String* string = (String*)malloc(sizeof(String));
string->data = NULL; //先把string指向NULL
string->len = 0; //len赋值为0
return string;
}
void assignString(String* string, char* data) //对string的data和len进行赋值
{
int len = 0; //记录当前的长度
char* temp = data; //temp指向data的字符串
if (string->data) //如果data没有数据就释放掉
{
free(string->data); //释放掉data
}
while (*temp) //如果temp有值的话
{
len++; //长度++
temp++; //temp地址++
}
if (len == 0) //如果长度为0
{
string->len = 0; //长度赋值为0
string->data = NULL; //data指向NULL
}
else
{
temp = data; //temp重新指向data
string->len = len; //记录长度
string->data = (char*)malloc(sizeof(char) * (len+1) );//因为输入的字符串是不定长的,所以重新储存空间
for (int i = 0; i < len; i++, temp++) //循环不仅是i,同时对temp地址自增
{
string->data[i] = *temp; //一个个保存temp的字符
}
}
}
void printfString(String* string)
{
for (int i = 0; i < string->len; i++)
{
printf(i == 0 ? "%c":"->%c",string->data[i]);
}
printf("NULL\n");
}
void forceString(String* master, String* sub) //字符串匹配
{
int i = 0; /*前指针*/
int j = 0; /*后指针*/
while (i < master->len && j < sub->len) //需要同时满足i、j都不能超过两个字符串的长度
{
if (master->data[i] == sub->data[j]) //当字符匹配
{
i++; //前指针++
j++; //后指针++
}
else
{
i = i - j + 1; //这里前指针指向的值确实是这样算出来的
//这里各位还是自己进行DEBUG一下就理解了
j = 0; //j归零是为了进行下一次的字符串匹配
}
}
if (j == sub->len) //当j等于第二个字符串的长度即为配对成功
{
printf("匹配成功\n");
}
else
{
printf("匹配不成功\n");
}
}
void main(void)
{
String* string = initString();
String* string_second = initString();
assignString(string,"HELLOWORLD");
assignString(string_second, "LD");
printfString(string);
printfString(string_second);
forceString(string, string_second);
}
总结
上诉代码或注释有错误地方,麻烦请指出,谢谢。