我有一个看起来像这样的结构:
typedef struct dictionary_t{
char word[30];
int foo;
int bar;
} dictionary_t;
形成有序数组:
dictionary_t dictionary[100];
我想使用bsearch()搜索此数组中的字符串,并获取指向该结构的指针。到目前为止,这有效:
dictionary_t* result;
char target[30] = "target";
result = bsearch(&target, dictionary, dict_length, sizeof(dictionary_t), (int(*)(const void*,const void*)) strcmp);
然而,这是一个hack并且只能起作用,因为字符串碰巧是结构的第一个成员。什么是在结构数组中查找字符串并返回指向结构的指针的更好方法?
答案 0 :(得分:2)
你应该实现你自己的比较器函数并将其传入。这里要记住的最重要的(非平凡的)是根据standard,
实现应确保第一个参数始终是指向键的指针。
这意味着您可以编写一个比较器来比较target
和dictionary_t
对象之类的字符串。这是一个简单的函数,可以将您的结构与字符串进行比较:
int compare_string_to_dict(const void *s, const void *d) {
return strncmp(s, ((const dictionary_t *)d)->word, sizeof(((dictionary_t *)0)->word));
}
然后,您可以将其作为普通函数指针传递给bsearch
:
result = bsearch(target, dictionary, dict_length, sizeof(dictionary_t), compare_string_to_dict);
请注意,target
不需要传入其地址,因为它不再模拟结构。
如果您想知道,sizeof(((dictionary_t *)0)->word)
是在word
中获取dictionary_t
大小的惯用方法。您也可以sizeof(dictionary[0].word)
或定义一个等于30的常量。它来自here。