一、我们的字符串结构体要包括什么?
需要一个字符串数组地址和保存字符串长度的变量
typedef struct String{
char* data;
int len;
}STRING;
二、任务是什么?
初始化字符串
暴力匹配
三、怎么初始化字符串?
初始化字符串就是传进来一个字符串的首地址
1.确定字符串结构体的首地址是否为/0,是就free掉
2.确定传进来的字符串长度(除去结束的/0长度)
3.根据确定的长度是否为0判断字符串结构体应该怎么做
如果传进来的字符串长度为0就初始化字符串结构体
否则给字符串结构体动态开辟一个空间,将传进来的字符串一一对应赋值
//初始化
STRING* init_string(void){
STRING* s = (STRING*)malloc(sizeof(STRING));
s->data = NULL;
s->len = 0;
return s;
}
//赋值
void get_string(STRING* s,char* data){
//先判断s的data是否有值,有就free掉
if(s->data==0){
free(s->data);
}
int len = 0;
char* temp = data; //传进来的字符串首地址;
//确定传进来的字符串除去/0的长度;
while(*temp != 0){
len++;
temp++;
}
if(len==0){
s->data = NULL;
s->len = 0;
}else{
s->len = len;
s->data = (char*)malloc(sizeof(char)*(len + 1));//字符串最后一个/0;
//给开辟的空间赋值;
for(int i=0;i<len;i++,data++){
s->data[i] = *data;
}
}
}
四、输出字符串结构体
//输出
void printf_string(STRING* s){
for(int i=0;i<s->len;i++){
printf(i==0? "%c\t":"%c\t",s->data[i]);
}
printf("\n");
}
五、暴力匹配算法是什么?
匹配前:图1
图2
图3
1.假设主字符串结构体为m,子字符串结构体为s,则先判断m->data[i] == s->data[i]
如果相等 i++;j++;
如果不相等,i就移动到刚刚位置的后一位,根据规律推算,即i = i-j+1;
j移动到子字符串的第一位,即j=0;
2.直到j指到m->len的时候就结束循环
3.如果j能够指到m->len的位置就表明暴力匹配成功:s是m的子字符串
否则表明暴力匹配失败:s不是m的子字符串
//暴力匹配
void force_macth(STRING* m,STRING* s){
int i,j;
i = j = 0;
while(i<m->len && j<s->len){
if(m->data[i] != s->data[j]){
i = i - j + 1;
j = 0;
}else{
i++;
j++;
}
}
if(j == s->len){
printf("force macth success!\n");
}else{
printf("force macth false!\n");
}
}
六、主函数代码
int main(void){
STRING* s = init_string();
get_string(s,"HELLO");
printf_string(s);
STRING* s1 = init_string();
get_string(s1,"HLL");
printf_string(s1);
force_macth(s,s1);
return 0;
}
int main(void){
STRING* s = init_string();
get_string(s,"HELLO");
printf_string(s);
STRING* s1 = init_string();
get_string(s1,"HEL");
printf_string(s1);
force_macth(s,s1);
return 0;
}