名 前
bsearch − ソ ー ト さ れ た 配 列 を 二 分 木 検 索 (binary search) す る
書 式
#include <stdlib.h>
void
*bsearch(const void *key, const void
*base,
size_t nmemb, size_t size,
int (*compar)(const void *, const void
*));
説 明
bsearch() 関 数 は nmemb 個 の オ ブ ジ ェ ク ト か ら な る 配 列 を 検 索 す る 。 配 列 の 最 初 の メ ン バ ー へ の ポ イ ン タ ー は base に よ っ て 与 え る 。 ポ イ ン タ ー key で 参 照 さ れ る オ ブ ジ ェ ク ト と 一 致 す る メ ン バ ー が 返 さ れ る 。 配 列 中 の 各 々 の メ ン バ ー の サ イ ズ は size に よ っ て 指 定 す る 。 配 列 の 内 容 は 比 較 関 数 compar に 基 づ き 、 昇 順 に ソ ー ト さ れ て い な け れ ば な ら な い 。 compar ル ー チ ン は 二 つ の 引 き 数 を 取 る 関 数 で 、 一 つ 目 に key へ の ポ イ ン タ ー 、 次 に 配 列 の メ ン バ ー へ の ポ イ ン タ ー を 取 る 。 こ の 順 に 指 定 し た と き 、 key が 配 列 メ ン バ ー よ り 小 さ い と き に は 負 の 整 数 を 、 大 き い と き に は 正 の 整 数 を 、 一 致 し た と き に は 0 を 、 そ れ ぞ れ compar は 返 さ な け れ ば な ら な い 。
返 り 値
bsearch() 関 数 は 、 配 列 の メ ン バ ー の う ち 、 一 致 し た も の へ の ポ イ ン タ ー を 返 す 。 見 つ か ら な か っ た と き は NULL を 返 す 。 key と 一 致 し た メ ン バ ー が 複 数 あ る と き 、 そ の う ち の ど の メ ン バ ー が 返 さ れ る か は わ か ら な い 。
準 拠
SVr4, 4.3BSD, POSIX.1−2001, C89, C99.
例
以 下 の 例 は 、 qsort(3) を 使 っ て 構 造 体 の 配 列 の 並 び 換 え を 行 っ た 後 、 所 望 の 要 素 を bsearch() を 使 っ て 取 得 す る も の で あ る 。
#include
<stdio.h>
#include <stdlib.h>
#include <string.h>
struct mi {
int nr;
char *name; }
months[] = {
{ 1, "jan" }, { 2, "feb" }, { 3,
"mar" }, { 4, "apr" },
{ 5, "may" }, { 6, "jun" }, { 7,
"jul" }, { 8, "aug" },
{ 9, "sep" }, {10, "oct" }, {11,
"nov" }, {12, "dec" } };
#define nr_of_months (sizeof(months)/sizeof(months[0]))
static int
compmi(const void *m1, const void *m2)
{
struct mi *mi1 = (struct mi *) m1;
struct mi *mi2 = (struct mi *) m2;
return strcmp(mi1−>name, mi2−>name); }
int
main(int argc, char **argv)
{
int i;
qsort(months,
nr_of_months, sizeof(struct mi), compmi);
for (i = 1; i < argc; i++) {
struct mi key, *res;
key.name = argv[i];
res = bsearch(&key, months, nr_of_months,
sizeof(struct mi), compmi);
if (res == NULL)
printf("'%s': unknown month\n", argv[i]);
else
printf("%s: month #%d\n", res−>name,
res−>nr); }
exit(EXIT_SUCCESS); }
関 連 項 目
hsearch(3), lsearch(3), qsort(3), tsearch(3)
こ の 文 書 に つ い て
こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。