首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++中的Bsearch函数问题

C++中的Bsearch函数问题
EN

Stack Overflow用户
提问于 2017-01-21 19:06:46
回答 1查看 503关注 0票数 0

我正在尝试使用bsearch,但是搜索的结果是按字母顺序排列的NULL.My数组的名字。我是个C新手,需要你的帮助来理解我哪里错了。

下面是一个数组

代码语言:javascript
复制
// arrays of children's names
char *chBamba[] = { "Bambale1", "Bamb2", "Bamb3", "Bambook4", "Bambookle5" };
char *chBisli[] = { "Bislile1", "Bischick2", "Bislile3", "Bis4" };
int nBamba = sizeof(chBamba) / sizeof(*chBamba);
int nBisli = sizeof(chBisli) / sizeof(*chBisli);
// array of workers
Worker a[] = { { "Printf", 10, NULL, 0 } ,{ "Bisli", 20, chBisli, nBisli },
{ "TapooChips", 3, chBamba, nBamba },{ "Bamba", 19, chBamba, nBamba } };

这是struct

代码语言:javascript
复制
typedef struct{
char name[LEN]; // worker's name
int salary; // worker's salary
char **childArr; // array of children names
int numChildren; // number of children}Worker;

比较函数

代码语言:javascript
复制
int compareNames(const void* child1, const void* child2){
  char* ch1 = (char*)child1;
  char* ch2 = (char*)child2;
  return strcmp(ch1, ch2);
}

和bsearch

代码语言:javascript
复制
  char childName[10];
  char* nameFound;
  printf("Please enter a child name to search for :");
  scanf("%s",childName);

  for (i = 0; i < 4; i++)
  {
    nameFound =(char*) bsearch(childName,a[i].childArr, a[i].numChildren, sizeof(a[i].childArr)/ sizeof(a[i].childArr[0]), compareNames);
  }

我现在正在学习的是C而不是C++.That,我使用的是VS 2015,它适用于C和C++.I。我正在编辑一些更改,以使其正确工作并进行编译。所以比较就是

代码语言:javascript
复制
int compareNames(const void * s1, const void * s2){
const char *key = (char*)s1;
const char * const *arg = (char**)s2;
return strcmp(key, *arg);

}

而bsearch是

代码语言:javascript
复制
nameFound = (char*)bsearch(childName,a[i].childArr, a[i].numChildren, sizeof(char*), compareNames);
EN

回答 1

Stack Overflow用户

发布于 2017-01-21 19:18:46

向比较函数传递指向数组元素的指针。

来自man bsearch

compar例程应该有两个参数,这两个参数分别指向key对象和数组成员...

该数组的元素属于char *类型,因此compare函数应如下所示:

代码语言:javascript
复制
int compareNames(const void * pvchild1, const void * pvchild2)
{
  const char ** ppc1 = (const char **) pvchild1; // casting necessary with C++
  const char ** ppc2 = (const char **) pvchild2; // casting necessary with C++

  return strcmp(*ppc1, *ppc2);
}

要另外介绍数组包含空指针值的情况,您可以这样做:

代码语言:javascript
复制
  ...

  return strcmp(ppc1 ?*ppc1 :"", ppc2 ?*ppc2 :"");
}

像这样调用bsearch()

代码语言:javascript
复制
  char * p = childName;
  nameFound =(char*) bsearch( // casting necessary with C++
    &p,
    a[i].childArr, 
    a[i].numChildren, 
    sizeof *(a[i].childArr), 
    compareNames
  );

另请注意:您明确显示的代码不是C,而是C++,如下所示

代码语言:javascript
复制
Worker a[] = { 
 { "Printf", 10, NULL, 0 } ,{ "Bisli", 20, chBisli, nBisli },
 { "TapooChips", 3, chBamba, nBamba },{ "Bamba", 19, chBamba, nBamba }  
};

不会在C中编译,但会给出错误:

代码语言:javascript
复制
error: initializer element is not constant
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41778571

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档