ホーム
全記事一覧
<< 前の記事
次の記事 >>
|
|
|
上記の広告は1ヶ月以上更新のないブログに表示されています。 新しい記事を書く事で広告が消せます。
|
--/--/-- --:--|スポンサー広告|▲
|
|
|
strchr関数は、文字列の中から指定した「文字」を探す関数でしたが、strstr関数は指定した「部分文字列」を探す関数です。意味的にはよく似ているのですが、細部の仕様がいろいろ異なっていたりします。
今回は、どのように実装すれば最も効率がよくなるのか、いろいろ検討したのですが、結局力任せで探索する方法を選んでしまいました。一応、検討した内容を簡単に書いておきます。
strstr関数は、数kバイトもある文字列を扱うことは稀なので、あまり凝ったアルゴリズムを使うと、短い文字列ではかえって速度が低下します。そこで、2〜4文字をワード単位で比較する方法も考えたのですが、場合分けが複雑になり、あまり有効ではないと判断しました。
結局出来上がったコードは、いまいちパッとしませんが、次のようになりました。
#include <stddef.h>
char *strstr(const char *s1, const char *s2) { int c = *s2++; if (c == '\0') return (char*)s1; do if (*s1 == c) { register const char *ss1, *ss2; for (ss1 = s1 + 1, ss2 = s2; *ss2 != '\0' && *ss1 == *ss2; ss1++, ss2++) ; if (*ss2 == '\0') return (char*)s1; } while (*s1++ != '\0'); return NULL; }
この辺の関数になってくると、次第に関数の出口(return文)が増えてきます。一箇所にまとめるのは簡単ですが、ブロックの入れ子が深くなるのと、若干無駄なコードが入るので、あえてこのようにしています。
strstr関数も、C++では、次の2つの形式が多重定義されます。
char* strstr(char* s1, const char* s2); const char* strstr(const char* s1, const char* s2);
これらの対応は、strchr関数などと同じなので、詳細は割愛します。
|
2006/04/20 11:45|文字列操作|TB:0|CM:0|▲
|
|
コメント
|
コメントの投稿
|
|
|
トラックバック
|
トラックバックURLはこちら
http://libc.blog47.fc2.com/tb.php/44-91d999da
|
|
|
ホーム
全記事一覧
<< 前の記事
次の記事 >>
|