天天看点

bsearch函数解析

bsearch函数解析

From: http://blog.csdn.net/liuweikai1338/article/details/4492338 函数格式:

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;

       }