使用bsearch在结构数组中寻找元素。

问题描述 投票:0回答:1

所以我有一个名为 conj_gms 的结构数组,我想找到一个特定的 jogo,鉴于其 nome.

结构。

typedef struct jogo
{
    int id;
    char equipas[2][1024];
    int pont[2];
    char nome[MAX_CHARS];
} jogo;

例如,我有jogo与

nome: ucl ,
equipas[0]: fcb,
equipas[1]: bvb,
pont[0]: 2,
pont[1]

在conj_jogs的索引1,如果我搜索字符串UCL,我希望使用bsearch后,该名称的jogo的id是1。

因此,我做了一个函数,创建一个jogo,并将其归于conc_jgs中的位置。

问题是,当我使用bsearch时,我得到了一个分割的错误。

程式。

#include<stdlib.h> 
#include<stdio.h>
#include <string.h>
#define MAX_CHARS 1024

static int id = 0;

typedef struct jogo
{
    int id;
    char equipas[2][1024];
    int pont[2];
    char nome[MAX_CHARS];
} jogo;

jogo make_game(char nome_jg[],char team1[],char team2[],int score1,int score2)
{
    jogo novo_jogo = {0};
    novo_jogo.id = id;
    strcpy(novo_jogo.equipas[0],team1);
    strcpy(novo_jogo.equipas[1],team2);
    strcpy(novo_jogo.nome,nome_jg);
    novo_jogo.pont[0] = score1;
    novo_jogo.pont[1] = score2;
    return novo_jogo;
}

int compare(const void *s, const void *d) {
    return strncmp(s, ((const jogo *)d)->nome, sizeof(((jogo *)0)->nome));
}

int main()
{
    int i; jogo* result;
    jogo conj_gms[MAX_CHARS];
    conj_gms[0] = make_game("DK","fcb","bvb",2,1);
    id++;
    conj_gms[1] = make_game("Elc","barca","rma",1,2);
    id++;
    conj_gms[2] = make_game("Class","fcp","slb",1,3);
    id++;
    conj_gms[3] = make_game("derby","slb","scp",4,1);
    id++;
    result = bsearch("Elc",conj_gms, 4, sizeof(jogo),compare);
    printf("found at index: %d",result->id);
}
c arrays structure bsearch
1个回答
2
投票

首先,结构数组应根据数据成员的值进行排序。nome. 你的结构数组没有排序。否则你必须使用线性搜索。

其次,你必须检查在调用了 bsearch

result = bsearch( "Elc", conj_gms, 4, sizeof(jogo),compare);
if ( result ) printf("found at index: %d",result->id);

由于数组没有按数据成员排序 nome 那么返回的指针等于 NULL.

在比较函数中,使用函数strcmp代替函数strncmp就可以了。

return strcmp(s, ((const jogo *)d)->nome );

如果要对数组进行排序

#include<stdlib.h> 
#include<stdio.h>
#include <string.h>
#define MAX_CHARS 1024

static int id = 0;

typedef struct jogo
{
    int id;
    char equipas[2][1024];
    int pont[2];
    char nome[MAX_CHARS];
} jogo;

jogo make_game(char nome_jg[],char team1[],char team2[],int score1,int score2)
{
    jogo novo_jogo = {0};
    novo_jogo.id = id;
    strcpy(novo_jogo.equipas[0],team1);
    strcpy(novo_jogo.equipas[1],team2);
    strcpy(novo_jogo.nome,nome_jg);
    novo_jogo.pont[0] = score1;
    novo_jogo.pont[1] = score2;
    return novo_jogo;
}

int cmp(const void *s, const void *d) {
    return strcmp( ((const jogo *)s)->nome, ((const jogo *)d)->nome );
}

int compare(const void *s, const void *d) {
    return strcmp(s, ((const jogo *)d)->nome );
}

int main()
{
    jogo* result;
    jogo conj_gms[MAX_CHARS];
    conj_gms[0] = make_game("DK","fcb","bvb",2,1);
    id++;
    conj_gms[1] = make_game("Elc","barca","rma",1,2);
    id++;
    conj_gms[2] = make_game("Class","fcp","slb",1,3);
    id++;
    conj_gms[3] = make_game("derby","slb","scp",4,1);
    id++;

    qsort( conj_gms, 4, sizeof( jogo ), cmp );
    result = bsearch( "Elc", conj_gms, 4, sizeof(jogo),compare);
    if ( result ) printf("found at index: %d",result->id);
} 

那么你就会得到预期的结果

found at index: 1

如果你想通过一些前缀找到数组中的一个元素,那么比较函数可以是这样的

int compare(const void *s, const void *d) {
    return strncmp(s, ((const jogo *)d)->nome, strlen( s ) );
}

0
投票

好吧,你应该改变行

result = bsearch("Elc",conj_gms, 4, sizeof(jogo),compare);

jogo const* result = bsearch("Elc",conj_gms, 4, sizeof(jogo),compare);
© www.soinside.com 2019 - 2024. All rights reserved.