2015-07-22 46 views
1

在C中使用bsearch未能在结构数组中找到字符串'Eva Lam'。该数组按字符串成员的降序排序。我检查了很多次,仍然不知道错误在哪里?顺便说一句,我正在使用DEV C++ 5.9.4。请帮助,非常感谢。bsearch未能在结构数组中找到字符串成员

#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"} 
    , {110, "Eva Lam"} 
    , {1, "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"); 
} 

但搜索“伊娃林”时,该程序的输出是:

*** Before Searching *** 
Student array #1 is { 
    [14123456, Mary Chan] 
, [110, Eva Lam] 
, [1, 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 
+0

删除'fflush(stdin);',这是未定义的行为。 –

回答

1

更仔细地阅读文档bsearch

该compar例程预计有两个参数指向按键对象和数组成员,按顺序。

这意味着您的比较函数的第一个参数将始终与您作为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); 
} 

而且,请不要投从bsearch用C void *指针,特别是从malloc,而且还返回值在你的代码。

+0

您对bsearch compar参数的解释非常明确且有用。现在,我完全明白它的用法。你的建议奏效,非常感谢艺术。但是为什么不在C中使用void *指针,特别是从malloc中,还要从bsearch返回值? – SJ0407

+0

因为没有理由将void指针指向其他指针。如果您忘记包含正确的函数声明,它可以隐藏代码中的错误。 – Art