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

プロフィール 

Author:高木信尚

ホームページ
ブログ

最近の記事 

最近のコメント 

最近のトラックバック 

月別アーカイブ 

カテゴリー 

ブロとも申請フォーム 

この人とブロともになる

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

 

2008/10/07 11:48|

 

今回はmemchr関数です。この関数は、nバイトの配列から文字cを探索するためのもので、文字cに一致する要素が見つかればその要素へのポインタを、見つからなければ空ポインタを返します。ここで、文字cは探索に先駆けてunsigned charに型変換されます。sが指す配列も、unsigned char型の配列であるとみなして扱われます。では、コードを見てみましょう。

#include <stddef.h>

void *memchr(const void *s, int c, size_t n)
{
  register const unsigned char *ss = s;
  register const unsigned char *t = ss + n;
  c = (unsigned char)c;
  while (ss != t && *ss != c)
    ++ss;
  return ss != t ? (void*)ss : NULL;
}

文字が見つかればその時点のポインタを返す処理をループの中に入れると、ややコンパイル結果が煩雑になりますので、ここではループを抜けてから空ポインタにするかどうかを判別しています。



memchr関数をC++に対応するには、もう少し手間がかかります。というのも、C++のmemchr関数は、Cのそれとは仕様が異なるからです。C++のmemchr関数は、次の2種類が多重定義されています。

void* memchr(void* s, int c, size_t n);
const void* memchr(const void* s, int c, size_t n);

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

extern "C" void* memchr(void*, int, size_t);

inline const void* memchr(const void* __s, int __c, size_t __n)
{
  return memchr(const_cast<void*>(__s), __c, __n);
}

のようにすれば、C++の仕様にあわせることができます。
2006/03/24 08:38|文字列操作TB:0CM:0

コメント
コメントの投稿

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


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

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

ブログ内検索 

お勧め書籍 

RSSフィード 

リンク 

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

Powered By FC2ブログ 

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

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