使用 bsearch 查找姓氏以字符 c 开头的人

Find person with surname that starts with character c using bsearch

我找不到我下面的代码有什么问题。它编译,但不能正常工作。它要做的是使用bsearch找到姓氏以字符c开头的人。

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>

    typedef struct {
         char name[26];
         char surname[26];    
    } Person;

    int compare(const void *a, const void *b) {
        char x = (*((Person*)a)).surname[0];
        char y = (*((Person*)a)).surname[0];
        if(x < y) return -1;
        else if(x > y) return 1;
        else return 0;
        }

int main() {

Person array_person[]={{"Mike", "Anthony"},
                   {"Dave", "Eric"},
                   {"Danny", "Markle"},
                   {"Anne", "Redmayne"},
                   {"Lulu", "Rsu"}};

char c;
scanf("%c",&c);

Person *p;
p = (Person*)bsearch(&c,array_person,sizeof(array_person)/sizeof(Person),sizeof(Person),compare);    

printf("%s %s",p->name, p->surname);
   
return 0;                       
}

调用的第一个参数(参数 'a' )需要是字符 c 而不是 Person 的实例。请看这里,希望对您有所帮助。

int compare(const void *a, const void *b) {
 char x = (*(char*)a);
 char y = ((Person*)b)->surname[0];
 if(x < y) return -1;
 else if(x > y) return 1;
 else return 0;
}

int main() {

   Person array_person[]={{"Mike", "Anthony"},
               {"Dave", "Eric"},
               {"Danny", "Markle"},
               {"Anne", "Redmayne"},
               {"Lulu", "Rsu"}};

   char c;
   scanf("%c",&c);

Person *p;
p = (Person*)bsearch(&c,array_person,sizeof(array_person)/sizeof(Person),sizeof(Person),compare);    
if( p==NULL )
    printf("Not found\n");
else
    printf("%s %s\n",p->name, p->surname);

return 0;                       

}

您需要注意,在您编写函数时,它总是会查找姓氏以给定字符开头的人,而不是所有的人。我不确定这是否是你应该实现的。