bsearch() - 在结构数组中查找字符串

时间:2017-05-09 14:32:23

标签: c string struct bsearch

我有一个看起来像这样的结构:

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并且只能起作用,因为字符串碰巧是结构的第一个成员。什么是在结构数组中查找字符串并返回指向结构的指针的更好方法?

1 个答案:

答案 0 :(得分:2)

你应该实现你自己的比较器函数并将其传入。这里要记住的最重要的(非平凡的)是根据standard

  

实现应确保第一个参数始终是指向键的指针。

这意味着您可以编写一个比较器来比较targetdictionary_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