• 締切済み

ボイヤームーア法

今課題が分からなくて困ってます。ボイヤームーア法でテキストファイルから文字列を探索するプログラムなんですが以下のようなプログラムは作成できたのですがこれだとテキストの同じ行に同じ文字列がある場合、最初の1つしか表示してくれません。課題は今日提出なので早急にお願いします。 例 テキストabcabcabc 文字列abc 結果abc line1 rank1 どうすれば全部表示させられるのか教えてください。 #include<stdio.h> #include<string.h> #define MAXCHR1 1000 #define MAXCHR2 256 int bm(char txt[MAXCHR1], char pat[MAXCHR2]) { int a,b,length1,length2,skip[MAXCHR2+1]; length1=strlen(txt); length2=strlen(pat); for(a=0;a<=MAXCHR2;a++){ skip[a] = length2; } for(a=0;a<length2 - 1;a++){ skip[pat[a]] = length2 - a - 1; } while(a<length1){ b=length2 - 1; while(txt[a] == pat[b]){ if(b==0){ return(a); } b--; a--; } a += skip[txt[a]]; } return(-1); } int main(void) { int x,line=0; char filename[MAXCHR2],ex[MAXCHR1][MAXCHR1],strg[MAXCHR2]; 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(); while(fgets(ex,MAXCHR1,fp)!=NULL){ x=bm(ex,strg); ++line; if(x==-1){ printf("There is not '%s' in %dth line\n",strg,line); } else{ printf("%s line%d rank%d\n",strg,line,x+1); } } fclose(fp); return 0; }

みんなの回答

回答No.2

同じタイトルで質問しないでください。 せめて前の質問くらい締め切ってから質問してください。 http://oshiete1.goo.ne.jp/qa2509995.html また、質問内容はBM法と関係ないただの文字列取り扱いの問題ですから その辺りも踏まえて必要なことだけ質問してください。 そもそも、自分の書いた(或いは教わった)プログラムくらい理解しようとしていますか? BM法をやるような授業なら、文字列の取り扱いは充分できるだけの内容があったはずですよね。 #肝心の回答については、bm()の仕様をよく見て#1さんの回答を読めば事が足りるので割愛。

battalion
質問者

お礼

ご指摘ありがとうございます。 まだ使って間もないもので申し訳ないです。 この度はご回答ありがとうございました。

回答No.1

> 課題は今日提出なので早急にお願いします。 なにを"早急にお願い"しているのでしょうか? そのものズバリの回答が欲しいのだとすると、虫が良すぎます。 > これだとテキストの同じ行に同じ文字列がある場合、最初の1つしか表示してくれません。 最初に見つかった位置の後方に続く文字列を検索対象とし再度検索するだけじゃないですか。 少しは自分で考えてはいかがですか?

battalion
質問者

お礼

結構の間考えたんですが自分の無知さが恥ずかしいです。 ご回答ありがとうございました。

関連するQ&A