【问题标题】:Using bsearch() function with array of structs in C [closed]在C中使用带有结构数组的bsearch()函数[关闭]
【发布时间】:2020-03-26 13:10:03
【问题描述】:

我有一个结构数组,我想在结构数组中找到一个整数键。 我的结构如下所示:

typedef struct{
    int x;
    int y;
    int area;
    int occurence;
}pair;

我想使用bsearch() 在数组中找到该区域的特定值。我有一组按qsort() 升序排序的对。我的代码如下所示:

qsort(pairs, nPairs, sizeof(pair), cmpArea);

int * tmp = NULL, area = someValue; 
tmp = (int *)bsearch(&area, pairs, nPairs, sizeof(pair), cmpArea);

if (tmp!=NULL)
   //do something
else
   //do something

//pairs is the name of the array, nPairs is number of elements

我尝试使用调试器查看这些值,而bsearch() 总是返回 NULL,不知道为什么。我怀疑我的比较功能是问题所在,但它看起来像这样:

int cmpArea(const void *a, const void *b){

    pair * pairA = (pair*)a;
    pair * pairB = (pair*)b;

    return (pairA->area - pairB->area);
} 

我尝试了不同的比较功能,但没有一个有效。我对你的想法持开放态度。谢谢。

【问题讨论】:

  • 欢迎来到 Stackoverflow。请发布minimal complete and verifiable example。也就是说,构建一个简单的例子来说明你的问题。人们需要能够查看和运行可以重现问题的实际代码(细节很重要)。您甚至可能在创建最小代码的过程中自己发现问题。
  • bsearch 的第一个参数看起来不对。它应该是一个指向包含键的对象的指针(而不是键值本身)。
  • 我在他们的示例中在cplusplus.com/reference/cstdlib/bsearch 找到了这种语法。但我会尽量采纳你的建议。
  • @CherryTW 该示例使用整数数组,因此在这种情况下,键指向整数是正确的。在您的情况下,您有一个结构数组。
  • pairs 是如何声明和分配的? (作为单个块(简单数组或单一分配)或指向 pair 的指针,具有单独的分配)MCVE 需要。

标签: c arrays struct bsearch


【解决方案1】:

在您的代码中,您指向的是键值,而不是实际的成员对象。

bsearch 的调用应该更像这样:

pair key_obj;
pair *result;
key_obj.area = someValue;
result = bsearch(&key_obj, pairs, nPairs, sizeof(pair), cmpArea);

有人向我指出,如果编写比较器来处理第一个 arg 可以指向 int *。在这种情况下,我们会:

int key_obj = someValue;
pair *result;

result = bsearch(&key_obj, pairs, nPairs, sizeof(pair), cmpArea);

int cmpArea(const void *a, const void *b){

    int *key = (int *)a;
    pair * pairB = (pair*)b;

    return (*key - pairB->area);
} 

【讨论】:

  • 哦,我明白了。感谢您的解释我还没有意识到我的密钥匹配类型错误。
  • 另外我会将 math_this 的其他变量设置为 0。
猜你喜欢
  • 2020-06-24
  • 2019-08-05
  • 1970-01-01
  • 2017-06-24
  • 2020-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多