• ベストアンサー

ボイヤームーア法について

課題が分からなくて困っています。課題の内容は「ボイヤームーア法を用いてファイルの先頭からテキストを1行ずつ(1行の文字数は999文字以下とする)読み込み、何行目の何文字目に探索文字列の先頭が存在するか出力するプログラムを作成せよ。探索文字列中に同じ文字が含まれる場合については探索方法を改良せよ」というものです。1行の文字列を探索するプログラムは作れたのですが、複数の行を読み込んで何行目の何文字目かを出力させる方法がどうしてもわかりません。無知な私ですがどうかよろしくお願いします。締め切りは明日なのでなるべく早くお願いします。 #include<stdio.h> #include<string.h> #define MAX1 1000 #define MAX2 256 int bm(char txt[MAX1], char pat[MAX2]) { int a,b,len1,len2,skip[MAX2+1]; len1=strlen(txt); len2=strlen(pat); for(a=0;a<=MAX2;a++){ skip[a]=len2; } for(a=0;a<len2-1;a++){ skip[pat[a]] = len2-a-1; } while(a<len1){  b=len2-1;   while(txt[a]==pat[b]){    if(b==0){ return(a);    }    b--;    a--;   }   a+=skip[txt[a]]; } return(-1); } int main(void) { int x; char filename[MAX2],ex[MAX1],strg[MAX2]; FILE *fp; printf("Input filename:"); scanf("%s",filename); getchar(); fp=fopen(filename,"r"); if(fp == NULL){ printf("read open error!\n"); return(-1); } printf("Input search string:"); scanf("%s",strg); getchar(); for(i=0;i<MAX1;i++){    if(feof(fp)){   break;  } fgets(ex[i],MAXCHR1,fp); } x=bm(ex,strg); if(x==-1){  printf("There is not pattern in the text"); } else{  printf("%s%d\n",strg,x+1); } fclose(fp); return 0; }

質問者が選んだベストアンサー

  • ベストアンサー
  • noocyte
  • ベストアンサー率58% (171/291)
回答No.2

int SearchFile(const char *filename, const char *searchString) { FILE *fp; char ex[MAX1]; /* 行バッファ */ long lineNo = 0; /* 行番号 */ int position; /* 行内の文字列の位置 */ /* ファイルをオープンする.*/ if((fp = fopen(filename, "r")) == NULL) { fprintf(stderr, "Can't open \"%s\" (%s)\n", filename, strerror(errno)); return -1; } /* ファイルを1行ずつ読む.*/ while(fgets(ex, MAX1, fp) != NULL) { lineNo++; /* 今読み込んだ行の行番号 */ /* 行内で searchString を探索する.*/ position = bm(ex, searchString); if(position >= 0) { /* searchString が見つかった場合 */ printf("%ld行目の%d文字目にあるよ.\n", lineNo, position + 1); break; /* 最初の1個だけ見つければいい場合はここで break する.*/ } } fclose(fp); return 0; }

battalion
質問者

お礼

おかげでなんとかわかりました。親切に教えてくださってどうもありがとうございます。

すると、全ての回答が全文表示されます。

その他の回答 (1)

回答No.1

> 複数の行を読み込んで何行目の何文字目かを出力させる方法がどうしてもわかりません。 fgetsで一行読んでは検索読んでは検索...するだけ。 int line = 0; while ( fgets(...) != NULL ) {  ++line;  /* 検索して見つかったらlineと共に表示 }

battalion
質問者

お礼

while文で繰り返し読み込ませればいいんですね?こんな事に気付かなかった自分が恥ずかしいです。ありがとうございました。

すると、全ての回答が全文表示されます。

関連するQ&A