void *bsearch(const void *key, const void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void ));
函数功能:
将key在一系列base表示的数据中进行挨个比较,base中每个数据的大小是size,
base中的数据总的个数是nmemb = sizeof(base)/sizeof(base[0]);
compar 函数提供给用户的接口,对所需的内容进行比较。compar会返回一个值,表示比较的结果,如果返回0,bsearch函数立即返回,并且返回在base中找到的位置信息,如果到最后都没有找到,则返回null。
函数心得:
该函数提供了复杂查找,减轻了我们在编程中经常遇到数据查找需要编写大量代码,同样会出现很多代码冗余, 效率不高的情况
函数示例:
#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);
}
return 0;
}