Boyer Moore动态数组实现

时间:2017-01-05 19:39:01

标签: c++ arrays dynamic

我试图实现Boyer Moore(坏字符启发式)算法,除了我想使用动态数组。任何人都可以帮我解决这个问题吗?这是我的源代码。

**/* Program for Bad Character Heuristic of Boyer Moore String Matching Algorithm */

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

# define NO_OF_CHARS 256


/* Driver program to test above funtion */
int main()
{
    char txt[];
    char pat[];

    ifstream myfile;
    string filename;

    cout<<"input file"<<endl;
    getline(cin, filename);

    myfile.open(filename.c_str());

        if(myfile.is_open()){
            cout<<"file not found"<<endl;

            while(getline(myfile, txt))
            {
                cout<<txt<<endl;
            }
           cout<<"pls input pattern"<<endl;
           cin.getline(pat[]);
           search(txt, pat);

           myfile.close();

        }
        else cout<<"file not found"<<endl:
    return 0;
}**

2 个答案:

答案 0 :(得分:0)

std :: string正是你在这种情况下所需要的。它的大小是动态的(因为它在读入时适当地调整大小)。只需确保在必要时使用c_str()成员函数传递char *指针部分。

答案 1 :(得分:0)

就像几天前一样,我还是这样做的,如果您仍然需要答案……只需声明一个动态char数组并将其传递给函数即可。

此处的 char str 参数可以采用动态char数组,并且使用badchar [NO_OF_CHARS]数组可以在使用搜索功能之前实现不良字符启发式。

void badCharHeuristic(char *str, int badchar[NO_OF_CHARS])
{
    int size = strlen(str);
    int i;

    for (i = 0; i < NO_OF_CHARS; i++)
        badchar[i] = -1;

    for (i = 0; i < size; i++)
        badchar[str[i]] = i;
}

此外,您的搜索功能应类似于:

void search(char *txt, char *pat)
{
    int s = 0;  // s is the variable that hold how many shift we are gonna make
    while (s <= (n - m))
    {
        int j = m - 1;

        while (j >= 0 && pat[j] == txt[s + j])
            j--;

        if (j < 0)
        {
            printf("pattern occurs at shift = %d ", s);
            s += (s + m < n) ? m - badchar[txt[s + m]] : 1;  //if s+m < n; s = m - badchar[txt[s + m] else; s = 1
        }
        else
            s += max(1, j - badchar[txt[s + j]]);
    }
}