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

プロフィール 

Author:高木信尚

ホームページ
ブログ

最近の記事 

最近のコメント 

最近のトラックバック 

月別アーカイブ 

カテゴリー 

友達申請フォーム 

この人と友達になる

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

 

2008/08/28 09:11|

 

strchr関数は、文字列の中から指定した文字を見つけるための関数です。memchr関数とも似ていますが、ナル文字が現れるまで探索を続けるか、予め長さを指定しているかの違いがあります。機能的にはよく似ていても、探索の終了条件が異なるとコードはかなり違ってきます。

#include <stddef.h>

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

ここで、最初の行でcをchar型にキャストしていますが、これは元のcがCHAR_MIN〜CHAR_MAXの範囲に収まっているかどうかわからないためです。charが符号付きの場合、このようなキャストは処理系定義の動作になりますが、GCCでは期待通りの結果になるため、この際移植性は捨てて、このような書き方にしました。


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

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

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

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

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

とすればOKです。
2006/04/13 10:16|文字列操作TB:0CM:2

コメント

strchr関数の探索範囲は、終端のナル文字を含みます。なので、現在のコードでは、第2引数にナル文字を渡したときの結果が標準とは異なります。
マイケル #-|2006/04/13(木) 23:09 [ 編集 ]


> strchr関数の探索範囲は、終端のナル文字を含みます。
いわれてみればそうですね。
直しておきます。
たかぎ #ftr86F3A|2006/04/13(木) 23:19 [ 編集 ]

コメントの投稿

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


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

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

ブログ内検索 

お勧め書籍 

RSSフィード 

リンク 

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

Powered By FC2ブログ 

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

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