C言語のプログラム(BM法)についての質問です。
テキストファイルweb.txtから文字列thereforeを検索し、thereforeの表れた回数を数えるプログラムを作っているのですが、thereforeの数が効率が悪い方法と一致しません。どうやらBM法のプログラムがthereforeをカウントできていない時があると思われます。
分かる方よろしくお願いします。
C Pad for Borland C++Compilerで作成しています。
どなたか教えて下さい。
BM法のプログラム-------------------
#include<stdio.h>
#include<string.h>
int bmSkip(int *skip, char *pattern, int patn_len);
int bm_search(char *text, char *pattern,int line)/*_テキストファイルweb.txtから文字列thereforeを検索する(BM法)_*/
{
int i;/*_注目しているテキストの位置_*/
int j;/*_注目しているパターンの位置_*/
int t=0;
int text_len,patn_len;
int skip[256],count = 0;
text_len = strlen(text);/*_テキストの長さをセット_*/
patn_len = strlen(pattern);/*_パターンの長さをセット_*/
bmSkip(skip,pattern,patn_len);
i=text_len-1;//iにテキストの最初の注目位置をセット
while( i > patn_len ) {
j=patn_len - 1;//jにパターンの最初の注目位置をセット
while(text==pattern[j]){//テキストとパターンを1文字比較
if(j==0){//すべての文字が一致したら
printf("Line%d, t=%d\n",line,t+1);
//printf("%s\n",text);
count++;
}
i--;//テキストの位置を1文字戻す
j--;//パターンの位置を1文字戻す
t++;
}
i-=skip[text];//テキストの注目点(i)を,不一致になった文字に応じた分量だけずらす
}
return count;
}
int bmSkip(int *skip, char *pattern, int patn_len)
{
int i;
for(i=0;i<256;i++){
skip=1;
}
for(i=0;i<patn_len;i++){
skip[pattern]=patn_len-i-1;
}
return 0;
}
int main(void)
{
char text[80],word[/url]="therefore";
FILE *fp;
int line = 0;
int count = 0;
fp = fopen("web.txt","r");
if(fp==NULL){
printf("cannot open file\n");
return -1;
}
memset(text,0x00,sizeof(text));//_読込み領域の初期化
while(fgets(text,80,fp)!=NULL){//_1行(80字以内)ずつ読み込みながら
line++;
count += bm_search(text,word,line);
memset(text,0x00,sizeof(text));//_読込み領域の初期化
}
fclose(fp);
printf("%s : %d times appear\n",word,count);// 個数を表示
return 0;
}
---------------------------------------------------
効率が悪いプログラム(1文字ずつ比較する)----------
#include <stdio.h>
#include <string.h>
int simplesearch( char *text, char *pattern, int line )
{
int i, j, t, m, n, count = 0;
n = strlen(text); //行の長さ
m = strlen(pattern); //検索パターンの長さ
for(t=0; t<n-m; t++) { //t:探索開始位置
for(i=t,j=0; j<m; i++,j++) {
if(text!=pattern[j]) break;
}
if(j==m) { //パターンの最後まで一致=発見
printf("Line%d, t=%d\n",line, t+1); //パターンの位置を表示
printf("%s\n",text); //パターンの含まれる行の文章を表示
count++;
}
}
return count;
}
int main(void)
{
char text[80], word[/url] = "therefore";
FILE *fp;
int line = 0;
int count = 0;
fp = fopen("web.txt","r");
if(fp==NULL) {
printf("cannot open file\n");
return -1;
}
while(fgets(text, 80, fp)!=NULL) { // 1行(80字以内)ずつ読み込みながら
line++;
count += simplesearch( text, word, line ); //素朴な手法により検索
}
fclose(fp);
printf("%s : %d times appear\n", word, count); //個数を表示
return 0;
}
----------------------------------------------------------------------