美文网首页
【tip】C库函数bsearch使用方法

【tip】C库函数bsearch使用方法

作者: papi_k的小茅屋 | 来源:发表于2024-01-15 14:22 被阅读0次

bsearch()函数——对数组进行二分查找。

函数声明
void *bsearch(const void *key, const void base, size_t nitems, size_t size, int (compar)(const void *, const void *))

参数
key -- 指向要查找的元素的指针,类型转换为 void
base -- 指向进行查找的数组的第一个对象的指针,类型转换为 void

nitems -- base 所指向的数组中元素的个数。
size -- 数组中每个元素的大小,以字节为单位。
compar -- 用来比较两个元素的函数,数组的内容应根据 compar 所对应的比较函数升序排序。

返回值
如果查找成功,该函数返回一个指向数组中匹配元素的指针,否则返回空指针。
示例1:查找字符串指针数组中元素

// 本片段以字符串指针数组为例(其他l类型如int,struct等同理实现)
int Cmp(const void *a, const void *b)
{
    char *src = *(char **)a;
    char *dst = *(char **)b;
    return strcmp(src, dst);
}

char *retStr[3] = {"abc", "bbc", "cbc"};
char *new = "bbc";
int count = 3;
char **find = bsearch(&new, retStr, count, sizeof(char *), Cmp); // 检索一个字符串。
if (find != NULL) {
    printf("find-%s\n", *find);
}

示例2:查找结构体数组中元素

/* 使用bsearch对结构体进行搜索,即使结构体中的所有字段并没有完全匹配,匹配一部分也可以,但这一部分要能够确定一个结构体。*/

// 结构体定义
typedef struct {
    char szStartTime[20];// 开始时间
    char szEndTime[20];  // 结束时间
    int  nId;            // ID号
    char szContent[20];  // 内容
} ST_SORT_CONTENT;

// 排序比较函数
int Cmp(const void *data1, const void *data2)
{
    ST_SORT_CONTENT *pContent1 = (ST_SORT_CONTENT *)data1;
    ST_SORT_CONTENT *pContent2 = (ST_SORT_CONTENT *)data2;
    // 按开始时间、结束时间、ID号进行比较排序,这里只根据前三个字段进行了排序,不管第4个char szContent[20]。
    int ret = strncmp(pContent1->szStartTime, pContent2->szStartTime, sizeof(pContent1->szStartTime));
    if(ret == 0) { // 如果开始时间相等,则比较结束时间
        ret = strncmp(pContent1->szEndTime, pContent2->szEndTime, sizeof(pContent1->szEndTime));
        if(ret == 0) { // 如果结束时间也相等,则比较id
            ret = pContent1->nId - pContent2->nId;
        }
    }
    return ret;
}

// 使用qsort升序排序
qsort(szContent, 6, sizeof(ST_SORT_CONTENT), CompareContent);

// 构建bsearch搜索的key,stKey有4个元素,只给前3个赋值了。
ST_SORT_CONTENT stKey;
memset(&stKey, 0, sizeof(ST_SORT_CONTENT));
strncpy(stKey.szStartTime, "2013-11-11 09:09:09", sizeof(stKey.szStartTime));
strncpy(stKey.szEndTime, "2013-11-11 10:10:10", sizeof(stKey.szEndTime));
stKey.nId = 1;

// 查找key对应的内容
ST_SORT_CONTENT *pResult = (ST_SORT_CONTENT *)bsearch(&stKey, szContent, 6, sizeof(ST_SORT_CONTENT), Cmp);
if(NULL == pResult) {
    printf("[%s] [%s] [%d]not found.\n", stKey.szStartTime, stKey.szEndTime, stKey.nId);
} else {
    printf("[%s] [%s] [%d] [%s] found.\n", pResult->szStartTime, pResult->szEndTime, pResult->nId, pResult->szContent);
}

示例3:查找整数数组中元素

int vec[] = {1, 3, 5, 8, 8, 9, 10, 11};

// p,返回要查找数所在位置的指针,若存在返回指针,不存在返回NULL
int key = 7;
int *p = bsearch(&key, vec, sizeof(vec) / sizeof(int), sizeof(int), Cmp);
printf("find 7 = %s\n", (p != NULL) ? "true" : "false"); // find 7 = false

// 找到值就返回,若有重复数值,返回的不一定是最小位置的数据地址指针
key = 8;
p = bsearch(&key, vec, sizeof(vec) / sizeof(int), sizeof(int), Cmp);
// 这个用法重要p - &vec[0],能找到index位置。
printf("find 8: index = %d, value = %d\n", p - &vec[0], *p); // 输出是find 8: index = 4, value = 8;

参考学习链接:
C 库函数 - qsort()
使用qsort排序结构体数组,使用bsearch查询结构体数组


yo peace!

相关文章

网友评论

      本文标题:【tip】C库函数bsearch使用方法

      本文链接:https://www.haomeiwen.com/subject/bkfhodtx.html