Manpages

名 前

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/ に 書 か れ て い る 。