bsearch
stdlib.h:インデックス への移動
ヘッダーファイル
stdlib.h
カテゴリ
メモリと文字列の操作ルーチン
プロトタイプ
void *bsearch(const void *key, const void *base, size_t nelem, size_t width, int (_USERENTRY *fcmp)(const void *, const void *));
説明
配列のバイナリ検索を実行します。
bsearch は,メモリ内の nelem 要素のテーブル(配列)を検索し,検索キーと一致するテーブル内の最初のエントリのアドレスを返します。配列は,整列されている必要があります。一致が見つからなかった場合,bsearch は 0 を返します。
メモ: これはバイナリ検索なので,最初の一致エントリがテーブル内の最初のエントリであるとは限りません。
型 size_t は,stddef.h ヘッダーファイルで定義されています。
- nelem は,テーブル内の要素の数です。
- width は,各テーブルエントリのバイト数を指定します。
比較ルーチン fcmp では,_USERENTRY 呼び出し規約を使用する必要があります。
fcmp は,elem1 と elem2 の 2 つの引数を使って呼び出されます。各引数は,比較する項目へのポインタです。この比較関数は,示された各項目(*elem1 と *elem2)を比較し,比較の結果に基づいて整数を返します。
- bsearch では,fcmp の戻り値は次のとおりです。
- *elem1 < *elem2 の場合は,< 0
- *elem1 == *elem2 の場合は,== 0
- *elem1 > *elem2 の場合は,> 0
戻り値
bsearch は,検索キーに一致するテーブル内の最初のエントリのアドレスを返します。一致が見つからなかった場合,bsearch は 0 を返します。
例
#include <stdlib.h>
#include <stdio.h>
typedef int (*fptr)(const void*, const void*);
#define NELEMS(arr) (sizeof(arr) / sizeof(arr[0]))
int numarray[] = {123, 145, 512, 627, 800, 933};
int numeric (const int *p1, const int *p2)
{
return(*p1 - *p2);
}
#pragma argsused
int lookup(int key)
{
int *itemptr;
/* コンパイル時の型の不一致エラーを回避するため,
(int(*)(const void *,const void*)) のキャストが
必要 */
itemptr = (int *) bsearch (&key, numarray, NELEMS(numarray),
sizeof(int), (fptr)numeric);
return (itemptr != NULL);
}
int main(void)
{
if (lookup(512))
printf("512 is in the table.\n");
else
printf("512 isn't in the table.\n");
return 0;
}
移植性
POSIX | Win32 | ANSI C | ANSI C++ |
---|---|---|---|
+ |
+ |
+ |
+ |