我正在努力在我的代码上执行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是一个包含单词的字符数组。
任何帮助都将不胜感激。
发布于 2018-05-21 22:26:59
bsearch()需要知道数组中每个元素的大小。它作为指针传递,所以bsearch()需要知道如何计算每个元素的偏移量。
当bsearch()尝试查找数组的nth元素时,它将执行如下操作:
ptr + size * n;(其中ptr是bsearch()的第二个参数,size是第四个参数)。
因此,如果您提供了错误的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);https://stackoverflow.com/questions/50450297
复制相似问题