繁体   English   中英

bsearch()c上的比较函数

[英]comparison function on bsearch() 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数组。

任何帮助将非常感激。

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

bsearch()试图找到数组的nth元素时,它将执行以下操作:

ptr + size * n;

(其中ptrbsearch()的第二个参数, 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);

您的比较函数将被传递(作为void * )指向数组2个元素的指针。 您的比较函数必须等效地对待这两个指针-正常方法是定义2个类型为“指针到数组元素”的局部变量,并将这两个参数分配给这些局部变量(不强制转换)。 然后通过取消引用那些本地的,适当类型的指针来比较这两个元素。

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

忽略以上内容。

(虽然bsearch() 可以使用qsort()可以使用的比较函数,但不必以这种方式编写该函数。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM