解答例
#include <stdio.h>
#include <string.h> /* 文字関係のライブラリ よくわかるC p71 */
/* プロトタイプ宣言 */
void print_text(char []); /* 文字列配列tの表示 */
int naive(char [], char []); /* 引数は文字の配列。別の書き方もある */
int main (void) {
char t[30]; /* 文字列の最後は \0 ヌル文字なので、最大29文字 */
char p[10];
int j; /* 戻り値をうけとる変数 マッチするなら、配列tの添え字 */
/* テキストは、教科書の例 p98 */
strcpy(t, "ababdababccbdcabcadb"); /* 文字列の代入 よくわかるC p68 */
/* テキストも入力させるなら、上をやめて、下のように
printf("文字列を入力してください :");
scanf("%s", t);
*/
/* パターンは入力 p98 */
printf("探したい文字列を入力してください :");
scanf("%s", p);
print_text(t); /* テキストの出力 */
j = naive(t,p); /* 素朴、力づく、力まかせのアルゴリズム実装 */
/* 戻り値に応じて、出力文 */
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 naive (char t[], char p[]){
int i = 0;
int j = 0;
int m = strlen(p); /* 文字列の長さ よくわかるC p71 文字列操作関数 */
int n = strlen(t);
/* 疑似コードを参考に 完成させてください。全体を、よく読み、納得すること*/
/* printf 文を差し込むなどして、変数の状態を出力、確認してみるとよい */
while (
if (i == m)
return (j - i);
else
return (-1);
}
/* 文字列の最後には\0 ヌル記号。例題集 5の定番処理です */
/* strlenで文字列のサイズを得て、ループする方法もある */
/* よくわかるC言語 p65 は forループで。以下はwhileループ版 */
void print_text(char t[]) {
int j = 0;
while (t[j] != '\0') { /* 最後のヌル文字ではない */
printf("t[%d] = %c\n", j, t[j]); /* 1文字をプリント */
j++;
}
}