c语言串的模式匹配BF

本人使用VC2019进行编程,该软件C中可以使用C++语法,故可能不严谨


前言

在校大学生,学习差,写写帖子长长写代码的记性。不好的地方大家请指正,谢谢。


提示:以下是本篇文章正文内容,下面案例可供参考

一、串

1.什么是串

“dsandjkasdna”
“dsad1231561”
“!@#$%^&*(”
c语言中只要有双引号括起来的,就叫串。双引号里什么都没有就叫空串。

2.逻辑结构

串的逻辑结构显然是线性的。字符间的前驱后继都是一对一的关系。所以是线性。

3.在内存中的存储形式

1.通过顺序表存储
顺序表存储就是开辟一块连续空间来存储,这块空间被定义为数组。说白了我们的顺序表都是数组,数组中每一块空间来存放一个字符。

typedef struct SString {
	char* str;                     //注意这里有指针但并不是用来做链表的,而是动态开辟数组用
	int len;
}SString; 

2.通过链表存储
链表就依然是最简单的链表定义,然后链表中的数据域就用来存放一个字符。

typedef struct LinkString{
char c;
struct LinkString *next;
}Stringnode;

3.通过块链存储
块链呢是为了解决链表的存储密度过低问题。比如我上面链式的定义里面,char c只占了1个空间,而struct LinkString *next占了4个,所以其实数据的存储密度只有20%。所以引出了块链,块链的数据域就不是指存放一个了,而是开辟一个数组多放几个,从而提高存储密度。

typedef struct KuaiLian {
	char c[size];				//size大小自己要多大设置多大
	struct LinkString* next;
}Stringnode;

二、代码实现

1.串的定义

typedef struct SString {
	char* str;
	int len;
}SString;

2.完整代码

#include<stdio.h>
#include <corecrt_malloc.h>
#include <string.h>

typedef struct SString {
	char* str;
	int len;
}SString;

void InitSString(SString &s,int size) {					//动态开辟空间进行字符串输入
	s.str =(char *) malloc(sizeof(char) * size);
	if (s.str == NULL) {
		printf("开辟空间失败。\n");
	}
	else
	{
		printf("input string:");
		scanf("%s", s.str);
		s.len = strlen(s.str);
		printf("初始化完成,字符串长度为:%d,字符为:%s\n", s.len, s.str);
	}
}

int BF(SString s,SString t) {					
	int i = 0, j = 0;
	while (i<s.len&&j<t.len)			//while结束条件就是主串或模式串已经比较到最后一个字符了
	{
		if (s.str[i] == t.str[j])
		{
			i++, j++;
		}
		else
		{
			i = i - j + 1;
			j = 0;
		}
		
	}
	if (j==t.len)				//找到了子串的条件
	{
		return i-j+1;
	}
	else						//没找到子串
	{
		return 0;
	}
}


int main() {
	SString s1,s2;
	int len;
	printf("input s1 length:");
	scanf("%d", &len);
	InitSString(s1, len);
	printf("input s2 length:");
	scanf("%d", &len);
	InitSString(s2, len);
	if (BF(s1, s2)) {
		printf("找到子串在主串中的位置为:%d\n", BF(s1, s2));
	}
	else
	{
		printf("在主串中没有找到该子串。\n");
	}
	return 0;
}

总结

串的模式匹配bf算法挺好理解的。while,if的嵌套比较,最终就可以得到答案。但是对于指针的操作让我错了不少比如:

s.str =(char *) malloc(sizeof(char) * size);
	if (s.str == NULL) {
		printf("开辟空间失败。\n");
	}
	else
	{
		printf("input string:");
		//注意这下面!!!!!
		scanf("%s", &s.str);//这是错误写法,仅仅就比正确写法多了个&。	
		//注意这上面!!!!!
		//另外下面对str求长度我用sizeof并不能算出str长度。所以直接用了strlen
		s.len = strlen(s.str);
		printf("初始化完成,字符串长度为:%d,字符为:%s\n", s.len, s.str);
	}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值