以下の課題問題を解き、レポートとして提出せよ。
与えられた文字列中に、別の文字列が含まれているかどうかを検査するプログラムを作成せよ。その際、大文字小文字を区別せずに検索すること。また、一致個所が複数ある場合は全て表示すること。
例えば、以下のような"You should backup your data files."という文字列と検索文字列として"you"が与えられたときに、前者に後者が含まれているかどうかを検査する。
この場合、先頭の "You"と途中の"you"の2個所が一致するので両方を表示する。
string="You should backup your data files."
pattern="you"
found at 0
found at 18
(含まれる場合は、その場所(先頭を0として何文字目か)を表示する)
string="You should backup your data files."
pattern="my"
(含まれない場合は、何も表示しない)
プログラムの雛型をここに置いておくので、このプログラムをベースにして必要なコードを追加すること。
関数search_string()
の中身を作ればよい。(main関数の中身は気にしなくてよい)
ただし、すでに書かれているstrlen()以外には、str
で始まる名前を持つ文字列データ操作ライブラリ関数 (strcmp()
など) を使わないこと。
toupper()
や tolower()
などの文字型データ操作ライブラリ関数は使用してよい。
ヒント:大文字と小文字の区別をしない比較を行なうには検査する文字を大文字か小文字に変換してから比較を行なえばよい。
文字列検索のアルゴリズムは何を使ってもよい。
ここに説明している通りの簡単な方法でもよい。ただし、この方法は無駄な比較が多く効率が悪い。
文字列探索の効率的なアルゴリズムとしてはKMP (Knuth-Morris-Pratt)法や BM (Boyer-Moore)法が有名である。(ただし、処理内容は複雑になる)
上記プログラムを機能拡張する。
string="You should backup your data files."
pattern="you"
found at 0
found at 18
total 2 time(s)
string="You should backup your data files."
pattern="you"
found at 0
found at 18
You should backup your data files.
^^^ ^^^
string="You should turn on your computer."
pattern="on"
replace="off"
You should turn off your computer.
fgets()関数は、第3引数をファイルへのポインタとすることで、ファイルから文字列を読み出すことができる。以下の例を参考に、ファイル内テキスト検索を実装せよ。
#include <stdio.h>
#define MAX_LEN 130
int main(void)
{
FILE *stream;
char str[MAX_LEN];
/* ファイルを読み込み専用で開く */
if ((stream = fopen("option2.txt", "r")) == NULL)
return -1;
/* (MAX_LEN-1) 文字まで、もしくは改行文字までを読み取る。*/
int l = 0;
while (fgets(str, MAX_LEN, stream) != NULL) {
printf("%d: %s\n", l++, str);
}
/* ファイルの使用が終わったら、必ずfclose()する*/
if (fclose(stream))
perror("fclose error");
}