我试图实现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;
}**
答案 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]]);
}
}