|
|
|
| 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:0|CM:0|▲
|
|
|
コメント
|
|
コメントの投稿
|
|
|
|
|
トラックバック
|
トラックバックURLはこちら
http://libc.blog47.fc2.com/tb.php/39-504fc405
|
|
|
|
|
ホーム
全記事一覧
<< 前の記事
次の記事 >>
|