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

プロフィール 

高木信尚

Author:高木信尚

ホームページ
ブログ

最近の記事 

最近のコメント 

最近のトラックバック 

月別アーカイブ 

カテゴリー 

ブロとも申請フォーム 

この人とブロともになる

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

 

上記の広告は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:0CM:0

コメント
コメントの投稿

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


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

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

ブログ内検索 

お勧め書籍 

RSSフィード 

リンク 

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

Copyright(C) 2006 TAKAGI Nobuhisa All rights reserved.
Powered by FC2ブログ. template designed by 遥かなるわらしべ長者への挑戦.
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。