[英]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;
(其中ptr
是bsearch()
的第二个参数, 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.