Я пытаюсь использовать алгоритм Хорспула, чтобы перечислить все экземпляры шаблона в строке. Моя строка очень длинная, к северу от 3 миллионов символов.
При windows мой код находит только первые ~ 230 экземпляров слова "the". На linux мой код находит первые ~ 580 экземпляров слова "the". В обоих случаях программа просто останавливается после достижения этого значения. Нет ошибки сегмента, нет прекращения, он просто глохнет. Должно быть более 2300 экземпляров слова "the"
Мой лог c выглядит следующим образом:
Используйте алгоритм horspool, чтобы найти первый экземпляр шаблона в целом строка
Использование алгоритма horspool для поиска следующего экземпляра шаблона (общая строка + предыдущий индекс horspool)
И так до индекса поиск превышает длину строки.
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void shifttable(char p[], int t[], int asciiSize)
{
int i,j,m;
m=strlen(p);
for(i=0;i<asciiSize;i++)
t[i]=m;
for(j=0;j<m-1;j++)
t[p[j]]=m-1-j;
}
int horspool(char src[],char p[], int table[])
{
int i,j,k,m,n;
n=strlen(src);
m=strlen(p);
i=m-1;
while(i<n)
{
k=0;
while((k<m)&&(p[m-1-k]==src[i-k]))
k++;
if(k==m)
return(i-m+1);
else
i+=table[src[i]];
}
return -1;
}
int main()
{
//Get pattern
char p[100];
printf("Enter the pattern: ");
gets(p);
int patternLength = strlen(p);
printf("Length: %d\n", patternLength);
//Get fileData
char * src = 0;
long length;
FILE * fp = fopen("data_5.txt", "r");
if (fp)
{
fseek (fp, 0, SEEK_END);
length = ftell (fp);
fseek (fp, 0, SEEK_SET);
src = malloc(length);
if (src)
{
fread (src, 1, length, fp);
}
fclose (fp);
}
//ShiftTable
int asciiSize = 128;
int * table = malloc(sizeof(int) * asciiSize);
shifttable(p, table, asciiSize);
int pos = 0;
int count = 0;
int numFound = 0;
while (count < length) {
printf("src:%d, count:%d\n", src, count);
pos=horspool(src+count,p, table);
if(pos>=0) {
count = count + pos + patternLength;
numFound++;
printf("#:%d, Position %d\n",numFound, count+1);
}
else {
break;
}
}
return 0;
}