bsearch

提供: RAD Studio
移動先: 案内検索

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++

+

+

+

+