#include <stdio.h>
#include <string.h> /* 文字関係のライブラリ よくわかるC p71 */
/* プロトタイプ宣言 */
void print_text(char []); /* 文字列配列tの表示 */
void compute_g(char [], int []); /* 引数は文字の配列。別の書き方もある */
int bm(char [], char []);
int main (void) {
char t[30];
char p[10];
int j;
/* 教科書の例 */
strcpy(t, "ababdababccbdcabcadb");
// strcpy(t, "aaaaaaaaaa"); /* p = "baaaa" */
printf("探したい文字列を入力してください :");
scanf("%s", p);
print_text(t); /* テキストの出力 */
j = bm(t,p); /* 簡略化bm法でいこう。p114のcompute_gだけを利用する */
/* 戻り値に応じて、出力文 */
if (j == -1) /* 見つからない */
printf("Pattern %s is not found \n", p);
else /* テキスト配列tの添え字jから見つかった */
printf("Pattern %s is matched at %d \n", p,j);
return 0;
}
int bm(char t[], char p[]) {
int j;
int i;
int g[255]; /* 添え字は1バイト文字アスキーに対応 */
int m = strlen(p);
int n = strlen(t);
int cmp = 0;
i = m - 1; /* パターンの一番後ろ */
j = m - 1; /* tの初期値も、そこから */
compute_g(p, g);
/* 簡略bm法で照合 */
printf("cmp = %d \n", cmp);
if (i == -1) /* pを前進しつくした場合は、照合成功 jも1つ前進すぎ */
return j+1;
else
return -1; /* jがNを超えた場合は、照合失敗 */
}
/* パターンに応じて、何文字スキップするか、gテーブルを作る */
void compute_g(char p[], int g[]) {
int i;
int m = strlen(p);
/* スキップテーブル gを作成 */
for (i=65; i < 123 ; i++) /* gテーブルの出力。デバッグ用 */
printf("g[%c]= %d \n",i,g[i]);
}
/* 文字列の最後には\0 ヌル記号 */
void print_text(char t[]) {
int j = 0;
while (t[j] != '\0') { /* 最後のヌル文字ではない */
printf("t[%d] = %c\n", j, t[j]); /* 1文字をプリント */
j++;
}
}
コメント