bsearch_s
Stdlib.h:インデックス への移動
ヘッダー ファイル
stdlib.h
カテゴリ
検索およびソート ユーティリティ
プロトタイプ
void *bsearch_s(const void * __key, const void * __base,
rsize_t __nelem, rsize_t __width,
(_USERENTRY *__fcmp)(const void *k, const void *i, void *__context),
void *__context);
説明
bsearch の代わりとなるもので、セキュリティ機能が強化されています。
bsearch_s は、メモリ内の __nelem 要素のテーブル(配列)を検索し、__base で定義された検索キーに一致する、テーブル内の最初のエントリのアドレスを返します。
配列内の各要素のサイズは、__width で指定します。
比較関数 __fcmp は、_USERENTRY 呼び出し規約と共に使用しなければなりません。 __fcmp が呼び出される配列は、昇順でソート済みでなければなりません。
__fcmp は、k(キー要素)、y(配列内の要素)、および__context の 3 つの引数を使用して呼び出されます。__context は、汎用的なユーザー実装を可能にするために __fcmp 関数に直接渡されます。 __fcmp は、以下のような値を取る整数を返します。
- *k < *y の場合は < 0
- *k == *y の場合は == 0
- *k > *y の場合は > 0
戻り値
bsearch_s は、検索キーに一致する、配列内の最初の要素のアドレスを返します。 一致が見つからない場合、bsearch_s は NULL を返します。
例
#include <stdlib.h>
#include <stdio.h>
typedef int (*fptr)(const void*, const void*, 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;
/* The cast of (int(*)(const void *,const void*))
is needed to avoid a type mismatch error at
compile time */
itemptr = (int *) bsearch_s(&key, numarray, NELEMS(numarray),
sizeof(int), (fptr)numeric, NULL);
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++ |
---|---|---|---|
+ |
+ |
+ |
+ |