首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >bsearch() c上的比较函数

bsearch() c上的比较函数
EN

Stack Overflow用户
提问于 2018-05-21 21:44:58
回答 1查看 616关注 0票数 0

我正在努力在我的代码上执行bsearch()中的比较函数。显然,我想根据包含结构(word_dict_t)的字典数组上的键字符串(来自链表)进行二进制搜索

代码语言:javascript
复制
typedef struct {
    word_t name;
    probarr_t prob;
} word_dict_t;

下面是我做的比较函数:

代码语言:javascript
复制
int cmp_func(const void *source, const void *dest) {
   const word_dict_t *dest_struct = (word_dict_t *)dest;
   return strcmp((const char*)source, dest_struct->name);
}

这是bsearch()函数的实现:

代码语言:javascript
复制
void categorize(list_t *list, word_dict_t dictionary[], int *num_dict) {
    int i=0;
    word_dict_t *result;
    word_t key;

    printf("%sSTAGE 4%s\n", LINE_STG, LINE_STG);

    while (!is_empty_list(list)){
        strcpy(key, *get_head(list));
        list=get_tail(list);

        result = (word_dict_t *) bsearch(key, dictionary, *num_dict,
                       sizeof(word_t),cmp_func);
        if (result==NULL){
            printf("%-32s NOT_NAME \n", key);
        }
        else{
            print_probabilities(result);
        }
        i++;
    }
}

word_t是一个包含单词的字符数组。

任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2018-05-21 22:26:59

bsearch()需要知道数组中每个元素的大小。它作为指针传递,所以bsearch()需要知道如何计算每个元素的偏移量。

bsearch()尝试查找数组的nth元素时,它将执行如下操作:

代码语言:javascript
复制
ptr + size * n;

(其中ptrbsearch()的第二个参数,size是第四个参数)。

因此,如果您提供了错误的size值(您正在做的),bsearch()将无法计算正确的地址。

修复-传递数组元素的正确大小:

代码语言:javascript
复制
result = bsearch(key, dictionary, *num_dict, sizeof(word_dict_t), cmp_func);

或者:

代码语言:javascript
复制
result = bsearch(key, dictionary, *num_dict, sizeof(dictionary[0]), cmp_func);
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50450297

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档