C99に対応した標準Cライブラリの実装レポートを行っていきます。

プロフィール 

Author:高木信尚

ホームページ
ブログ

最近の記事 

最近のコメント 

最近のトラックバック 

月別アーカイブ 

カテゴリー 

ブロとも申請フォーム 

この人とブロともになる

ホーム 全記事一覧 << 前の記事 次の記事 >>

 

2008/10/07 11:40|

 

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:0CM:0

コメント
コメントの投稿

管理者にだけ表示を許可する


トラックバック
トラックバックURLはこちら
http://libc.blog47.fc2.com/tb.php/44-91d999da

ホーム 全記事一覧 << 前の記事 次の記事 >>

ブログ内検索 

お勧め書籍 

RSSフィード 

リンク 

このブログをリンクに追加する

Powered By FC2ブログ 

Powered By FC2ブログ
ブログやるならFC2ブログ

Copyright(C) 2006 TAKAGI Nobuhisa All rights reserved.
Powered by FC2ブログ. 無料ホームページ アフィリエイト レンタルサーバー FC2ブログ 一戸建て template designed by 遥かなるわらしべ長者への挑戦.