1

在 C 中使用 bsearch 未能在结构数组中找到字符串“Eva Lam”。该数组按字符串成员的降序排列。查了很多遍,还是不知道bug在哪里?顺便说一句,我使用的是 DEV C++ 5.9.4。请帮忙,非常感谢。

#include <stdio.h>
#include <stdlib.h>     // for bsearch
#include <string.h>
#define SIZE 4   
#define NAME_SIZE 20

struct student {
  int id;
  char name[NAME_SIZE];
};

// Function prototypes
int comp_name(const void* a, const void* b);
void print_struct_array(struct student studs[], int size, int serial);

int main(){
  int i, option=0;
  struct student *stud, *target;

  // studs array already sort in descending order of name
  struct student studs[SIZE] = {{14123456, "Mary Chan"}
    , {11001234, "Eva Lam"}
    , {10123456, "David Wong"}
    , {12345678, "Chris So"}
  };

  printf("*** Before Searching ***\n");
  print_struct_array(studs, SIZE, 1);

  target = (struct student*) malloc(sizeof(struct student));
  if (target == NULL) {
    fprintf(stderr, "Out of memory!\n");
    return -1;
  }

  printf("Input student name to search: ");
  scanf("%[^\n]", target->name);
  fflush(stdin);
  printf("name=%s\n", target->name);


  stud = (struct student *)bsearch(target->name, studs, SIZE,  
    sizeof(struct student), comp_name);
  if (!stud)
     printf("name %s not found!\n", target->name);
  else
     printf("[id, name] found is [%d, %s]\n", stud->id, stud->name);


  return 0;
}

int comp_name(const void* a, const void* b) {
   printf("comp_name: a->name=%s, b->name=%s\n", 
     (*(struct student *)a).name, (*(struct student *)b).name);
   return strcmp((*(struct student *)b).name, 
     (*(struct student *)a).name);
}


void print_struct_array(struct student studs[], int size, int serial) {
  int i;

  printf("Student array #%d is {\n", serial);
  for (i=0; i<SIZE; i++) {
    if (i==0) 
      printf("  ");
    else if (i<=SIZE-1)
      printf(", ");
    printf("[%d, %s]\n", studs[i].id, studs[i].name);
  }
  printf("}\n");
}

但是搜索“Eva Lam”时程序的输出是:

*** Before Searching ***
Student array #1 is {
  [14123456, Mary Chan]
, [11001234, Eva Lam]
, [10123456, David Wong]
, [12345678, Chris So]
}
Input student name to search: Eva Lam
name=Eva Lam
comp_name: a->name=Lam, b->name=Eva Lam
comp_name: a->name=Lam, b->name=Mary Chan
name Eva Lam not found!

--------------------------------
Process exited after 8.216 seconds with return value 0
4

1 回答 1

1

bsearch更仔细地阅读文档。

比较例程应该有两个参数,它们依次指向键对象和数组成员。

这意味着您的 compare 函数的第一个参数将始终与您作为第一个参数提供的bsearch. 因此,要么将其称为:bsearch(target, studs, ...)或者更好的是,将您的比较函数重写为:

int
comp_name(const void *av, const void *bv) {
    const char *a = av;
    const struct student *b = bv;
    printf("comp_name: a->name=%s, b->name=%s\n", a, b->name);
    return strcmp(b->name, a);
}

另外,请不要void *在 C 中转换指针,尤其是 from ,但也不要在代码中转换malloc返回值 from 。bsearch

于 2015-07-22T07:27:41.450 回答