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

プロフィール 

Author:高木信尚

ホームページ
ブログ

最近の記事 

最近のコメント 

最近のトラックバック 

月別アーカイブ 

カテゴリー 

ブロとも申請フォーム 

この人とブロともになる

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

 

2008/10/07 11:45|

 

strrchr関数は、strchr関数と似ていますが、指定した文字が最後に現れた位置を返します。逆方向に探索を行ってもよいのですが、それでは、少なくとも文字列を2回走査しないといけないので、順方向に探索し、指定した文字が現れた時点で変数を上書きしていく方法を採ります。

#include <stddef.h>

char *strrchr(const char *s, int c)
{
  char *result = NULL;
  c = (char)c;
  do
    if (*s == c)
      result = (char*)s;
  while (*s++ != '\0');
  return result;
}

ほとんどstrchr関数と変わりませんが、文字が見つかった時点で即終了するのではなく、いったんresultに格納して、ループを続行しています。



strrchr関数は、strchr関数と同様、C++では以下の2種類の形式が多重定義されています。

char* strrchr(char* s, int c);
const char* strrchr(const char* s, int c);

外部定義されたstrrchr関数のコードはCで記述することになりますから、上記のいずれとも合致しないわけですが、C結合にしてしまえば、この程度の型の違いは無視できます(この辺りの事情はstrchr関数と同じです)。したがって、

extern "C" char* strrchr(char*, int);

inline const char* strrchr(const char* __s, int __c)
{
  return strrchr(const_cast(__s), __c);
}

とすればOKです。
2006/04/14 00:40|文字列操作TB:0CM:0

コメント
コメントの投稿

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


トラックバック
トラックバックURLはこちら
http://libc.blog47.fc2.com/tb.php/43-7f9b6400

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

ブログ内検索 

お勧め書籍 

RSSフィード 

リンク 

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

Powered By FC2ブログ 

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

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