1、实验目的
键盘输入目标串(主串)s、模式串(子串)t,编写程序,实现顺序串的BF模式匹配算法。
2、实验具体要求
匹配成功,输出位序,匹配不成功,显示相应提示信息。
例如:s=“aababcdcccc”,t=“bcd”。
3、实验设计思路(编程语言、模块划分及函数功能描述等)
模块划分及函数功能描述:
(1)主程序模块(main函数):负责程序的整体流程控制,包括接收用户输入、调用BF算法进行模式匹配,以及输出结果。
(2)BF算法模块(BF_Search函数):包含BF模式匹配算法的实现,接收主串和模式串作为参数,返回模式串在主串中的起始位置(如果找到)或-1(如果未找到)。
(3)main函数
功能:程序入口点,负责程序的初始化、输入接收、算法调用和结果输出。
流程:使用printf函数提示用户输入主串和模式串。使用fgets函数从标准输入读取主串和模式串,并去除字符串末尾的换行符。调用BF_Search函数进行模式匹配。根据BF_Search函数的返回值输出结果。
(4)BF_Search 函数
流程:使用strlen函数获取主串和模式串的长度。使用两个指针i和j分别指向主串和模式串的当前字符。在主串未遍历完且模式串未匹配完的情况下进行循环。如果当前字符匹配,则两个指针都向后移动一位。如果当前字符不匹配,则将主串指针回溯到模式串长度的下一个位置,模式串指针重置为0。如果模式串匹配完(即j等于模式串长度),则返回主串指针当前位置减去模式串长度(即模式串在主串中的起始位置)。如果主串遍历完仍未找到匹配,则返回-1表示未找到。
4、实验源程序、程序调试结果
源程序:
#include <stdio.h>
#include <string.h>
// BF模式匹配算法
int BF_Search(char* s, char* t) {
int i = 0, j = 0;
int s_len = strlen(s);
int t_len = strlen(t);
while (i < s_len && j < t_len) {
if (s[i] == t[j]) {
i++;
j++;
}
else {
i = i - j + 1; // 移动主串指针到模式串的下一个字符开始位置
j = 0; // 重置模式串指针
}
}
if (j == t_len) {
// 匹配成功,返回模式串在主串中的起始位置
return i - j;
}
else {
// 匹配失败
return -1;
}
}
int main() {
char s[100], t[100];
// 从键盘读取主串和模式串
printf("请输入主串s: ");
fgets(s, sizeof(s), stdin); // 注意fgets会读取换行符,如果需要去除可以在后面处理
s[strcspn(s, "\n")] = 0; // 去除字符串末尾的换行符
printf("请输入模式串t: ");
fgets(t, sizeof(t), stdin);
t[strcspn(t, "\n")] = 0; // 去除字符串末尾的换行符
// 调用BF_Search函数进行匹配
int pos = BF_Search(s, t);
if (pos != -1) {
// 匹配成功
printf("模式串在主串中的位序为: %d\n", pos);
}
else {
// 匹配失败
printf("模式串在主串中未找到\n");
}
return 0;
}
调试结果:
匹配成功:
匹配不成功:
5、程序调试过程中遇到的问题及解决办法
(1)出现缺少“scanf_s”的整型参数的问题。因为没有传入字符串长度的参数,所以出现此问题。需要提供一个数字以表明最多读取多少位字符,同时提高了安全性。
(2)对字符的长度掌控不到位,范围给的太小了。改变字符串的长度范围,使输入的字符串都能显示出来。
6、实验收获与体会
(1)了解和掌握了在顺序串上实现串的基本运算算法和串的简单模式匹配Brute—Force算法。
(2)通过反复的尝试,发现该算法思路简单,但在最坏时间的复杂程度很高,比较次数较多,所以探究新的方法KMP算法,尝试多种的可能性。