我正努力在我的代码中使用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数组。
非常感谢任何帮助。
答案 0 :(得分:3)
bsearch()
需要知道数组中每个元素的大小。它作为指针传递,因此bsearch()
需要知道如何计算每个元素的偏移量。
当bsearch()
尝试查找数组的nth
元素时,它会执行以下操作:
ptr + size * n;
(其中ptr
是bsearch()
的第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()
也可以使用的比较函数,但是编写函数并不是必需的。)