bsearch()上的比较函数c

时间:2018-05-21 13:44:58

标签: c

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

typedef struct {
    word_t name;
    probarr_t prob;
} word_dict_t;

这是我做的比较功能:

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()函数的实现:

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是一个包含单词的char数组。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:3)

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

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

ptr + size * n;

(其中ptrbsearch()的第2个参数,size是第4个参数。

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

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

result = bsearch(key, dictionary, *num_dict, sizeof(word_dict_t), cmp_func);

或:

result = bsearch(key, dictionary, *num_dict, sizeof(dictionary[0]), cmp_func);

答案 1 :(得分:0)

您的比较函数将传递(作为void *)指向数组的2个元素的指针。您的比较函数必须等效地处理这两个指针 - 通常的方法是定义2个类型为&#34的局部变量;指向数组元素",并赋予这些局部变量的两个参数(没有强制转换) ;然后通过解除引用那些本地的,适当类型的指针来比较2个元素。

您的样本比较函数将两个参数转换为指针 - 两种不同的类型。你将度过一段美好的时光。

忽略上述内容。

(虽然bsearch() 可以使用qsort()也可以使用的比较函数,但是编写函数并不是必需的。)