文字列照合アルゴリズムのBFアルゴリズム(Cプログラム実装)

//文字列BFアルゴリズムのパターンマッチングプロセスが図に示されているため、説明しません


。//このプログラムは移植性プログラムです。

// Linux / Mac os / Windowsでコンパイルして実行できます。

//欠点がある場合は、それを上げてください。ブロガーは最善を尽くして修正します。

//それがあなたにとって有用であるならば、それを好きにするか、他の人と共有してください。

//盗用および許可なく転載することは固く禁じられています。

//ソースコードはこちらです。刺激を受けたいと思います。

//brute_force.c

#include <stdio.h>
#include <string.h>
#define LEN 20

char *s_gets(char *st, int n);
int brute_force(const char *s, const char *t, int pos);

int main(int argc, char *argv[])
{
    
    
    int n;
    char str1[LEN];
    char str2[LEN];

    printf("本程序采用BF模式匹配算法判断子串是否处于主串中\n");
    printf("请输入主串(换行结束输入):\n");
    while (s_gets(str1, LEN) && *str1 != '\0')
    {
    
    
        printf("请输入子串:\n");
        if (s_gets(str2, LEN) && *str2 != '\0')
        {
    
    
            n = brute_force(str1, str2, 0); //从起始字符开始匹配,可任意决定匹配位置;
            if (n != -1)
            {
    
    
                printf("子串%s在主串%s中, 子串出现于主串第%d个位置\n", str2, str1, n);
            }
            else
            {
    
    
                printf("子串%s不在主串%s中\n", str2, str1);
            }
            printf("您可以再次输入2串字符串(或换行退出):\n");
        }
    }
    printf("本程序完成!\n");

    return 0;
}

char *s_gets(char *st, int n) //这是一个字符串输入函数,防止内存泄漏;
{
    
    
    char *ret_val;
    char *find;

    ret_val = fgets(st, n, stdin);
    if (ret_val)
    {
    
    
        find = strchr(st, '\n');
        if (find)
        {
    
    
            *find = '\0';
        }
        else
        {
    
    
            while (getchar() != '\n')
                continue;
        }
    }
    return ret_val;
}

int brute_force(const char *s, const char *t, int pos)
{
    
    
    int i = pos;             //主串从第pos个位置开始匹配;
    int j = 0;               //子串从第一个字符开始匹配;
    int slength = strlen(s); //获取主串长度;
    int tlength = strlen(t); //获取子串长度;

    while (i < slength && j < tlength)
    {
    
    
        if (s[i] == t[j]) //若主串字符与子串字符匹配;
        {
    
    
            ++i; //则进行下一个字符匹配;
            ++j;
        }
        else //若是不匹配;
        {
    
    
            i = i - j + 1; //则主串计数器i回溯到上一次匹配字符的下一个字符;
            j = 0;         //子串从头开始匹配;
        }
    }
    if (j >= tlength) //若子串计数器j大于或等于子串长度说明匹配成功;
    {
    
    
        return i - tlength + 1; //返回子串第一个字符出现在主串的位置;
    }
    else
    {
    
    
        return -1; //若计数器j小于子串长度说明匹配失败,返回-1;
    }
}

// ------------------------------------------------ ---------;

// ------------------------------------------------ -2020年6月15日---------------------------------------------- ----------;

おすすめ

転載: blog.csdn.net/m0_46181359/article/details/106765024
おすすめ