C言語関係掲示板

過去ログ

No.94.文字列検索プログラムです


文字列検索プログラムです。

後々、置換機能なども付けていく予定です。
下記の所に置きますので気になる点などありましたら
ご指摘ください。

http://web9.freecom.ne.jp/~shuz/search.c


ども。


ポイントだけ。

仕様の確認。

・検索文字列の重なりを許すか?("aaa"の中に"aa"はいくつありますか?)
・実行時引数が3以上の時は?
・1行が256文字を超えたときの動作は?

気になったこと。

・作業用バッファは構造体に持たないほうがよいのでは?
・fgets()の読み込み長さは定数かsizeofのほうがよいのでは?
・最初の1文字を比較する意味は?

とりあえず、このくらい。

ファイルを閉じるのを忘れずに。


では。


>・1行が256文字を超えたときの動作は?

他の部分の修正は容易ですが、この部分の処理だけ
ちょっと難しそうですね。
とりあえず多めに256用意したわけですが、少し考えてみます。


ども。


仕様のおはなし。


えーとですね、前回のレス(の最初のほうに書いてあるの)は、仕様が明文化
されていなかったので、いくつかの点についてとりあえず確認した、という
ものです。なので、個人的な意見が含まれている可能性が大いにありますし
必ずそうしなければならないというようなものでもありません(って前回書いて
おけばよかったですね)。なんでこんなことを書いたかというと、仕様に
関しても口出ししていいのかわからなかったからです。。
# もし口出しOKならば、あれをそのまま反語として解釈してください。。

たとえば、3つめ以降の実行時引数は無視するという仕様で作っているので
あれば、あれでぜんぜん問題ないわけです。それとか、別に1行は256文字
以内であるという制限を仕様として盛り込んでもいいわけです。で、256文字
を超えた場合は「行が長すぎます」と表示して処理を続けるなり中断するなり
するよう(な仕様)にしてもいいのです。

極端な話、「未定義」というのも仕様としてはありかなしかといえばありなの
ですが、他人がそのことをコードや実行時の動作から読み取ることを期待しては
いけません。

見た人が、「これはミスかな?」と感じたことがあっても、コードからのみ
では、それが仕様なのかミスなのか判断のつかないものもありますので。
"aaa"のなかに〜 の問題は、まさにこれに相当し、重なり可のつもりなのか
(ならばあれでOK)、本当は重なり不可のつもりだったのだけれど処理を忘れた
のか、そこまで考えていなかったのか、のどれなのかがコードだけからでは
判断がつきません。


ある程度複雑な処理をしようとする場合は、どういう場合はどうする、とか、
使用に際してこういう制限があるというのを、コーディング前に、可能な
限りきちっと決めておかないと、いいプログラム、バグのすくないコードは
書けません。

これは一種の技術であり、どれだけキチンとできるかは経験によるところが
大きいのでは、と思います。そういうことを、"常に意識して"プログラミング
すれば自然にそのうち身につくでしょう。たぶん。。


さいごに。

ある仕様にもとづくプログラムがいいものかどうかはまた別の問題です。
たとえば、極端な例として挙げた、未定義動作を含むようなプログラムは
それが仕様であっても、まず、いいプログラムとはいえないと思います。

設計上(仕様上)のミスがないプログラムは、よいプログラムであるための重要な
1つの条件です。


では。

p.s.
1行256文字問題の解決方法を楽しみに期待してしています。
過去に自分も(安直な方法で)やったことがあるので。。


>仕様のおはなし。
>
>設計上(仕様上)のミスがないプログラムは、よいプログラムであるための重要な
>1つの条件です。

いつもいつも、的確なご指摘ありがとうございます。
とりあえず、仕様として書いたほうが良さそうなところは、
自分なりにまとめてみました。

>p.s.
>1行256文字問題の解決方法を楽しみに期待してしています。
>過去に自分も(安直な方法で)やったことがあるので。

ここのところはいろいろ調べてみましたが、結局分りませんでした。
ファイルを使おうとしたところで、パニックになってしまったので、
少し戻って、あらかじめ用意した文字列から指定した文字列を検索するものに
変えました。(改行を含む文字列だったり、文字コードが違いを区別するだけでも大変そうで、そんなことを考えると余計パニックになるのもので)

http://web9.freecom.ne.jp/~shuz/StrSerch.lzh


shuさん、いつも書き込みありがとうございます。

内容へのレスではないのですが、ご相談です。
過去ログをまとめるときに、shuさんが別サーバにまとめたプログラムを
こちらにコピーさせていただいても構いませんか。


>shuさん、いつも書き込みありがとうございます。
>
>内容へのレスではないのですが、ご相談です。
>過去ログをまとめるときに、shuさんが別サーバにまとめたプログラムを
>こちらにコピーさせていただいても構いませんか。

どしどし載せちゃってください。


>>shuさん、いつも書き込みありがとうございます。
>>
>>内容へのレスではないのですが、ご相談です。
>>過去ログをまとめるときに、shuさんが別サーバにまとめたプログラムを
>>こちらにコピーさせていただいても構いませんか。
>
>どしどし載せちゃってください。

とはいったものの、更新するたびに上書きしてたような気がするので
ちゃんとしたものが残っているか解らないのです。
現在使っているスペースが、近々サービスを停止するといってメールも
届いてましたので。
最終的に完成したソースなら、用意できると思うのですが。
このような事態は、考えていなかったもので・・・
googleのキャッシュで探しみよっかな。


shuさん、ご了承ありがとうございます。

>とはいったものの、更新するたびに上書きしてたような気がするので
>ちゃんとしたものが残っているか解らないのです。
>現在使っているスペースが、近々サービスを停止するといってメールも
>届いてましたので。

大急ぎで、今保存できるものは保存しました。
ここと、「私って綺麗・・・」だけで、いいんでしたっけ?

>最終的に完成したソースなら、用意できると思うのですが。
>このような事態は、考えていなかったもので・・・
>googleのキャッシュで探しみよっかな。

何か、情報ありましたら、ご連絡ください。

最近、内容が難しくて十分な返信ができないので、せめてきちんと
ログを残そうかと思っています。
サポートしてくださる方々、本当にありがとうございます。

戻る


「初心者のためのポイント学習C言語」 Last modified:2002.01.11
Copyright(c) 2000-2002 TOMOJI All Rights Reserved