使用 bsearch 在结构数组中查找元素
Finding an element in an array of structs using bsearch
所以我有一个名为 conj_gms 的结构数组,我想找到一个特定的 jogo
,给定它的 nome
.
结构:
typedef struct jogo
{
int id;
char equipas[2][1024];
int pont[2];
char nome[MAX_CHARS];
} jogo;
例如我和
nome: ucl ,
equipas[0]: fcb,
equipas[1]: bvb,
pont[0]: 2,
pont[1]
在 conj_jogs 的索引 1 处,如果我搜索字符串 UCL,我希望使用 bsearch 后具有该名称的 jogo 的 ID,即 1.
所以我为此创建了一个函数来创建一个 jogo 并将它们归因于 conj_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);
}
对于初学者,结构数组应按数据成员的值排序 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 ) );
}
好吧,你应该改行
result = bsearch("Elc",conj_gms, 4, sizeof(jogo),compare);
到
jogo const* result = bsearch("Elc",conj_gms, 4, sizeof(jogo),compare);
所以我有一个名为 conj_gms 的结构数组,我想找到一个特定的 jogo
,给定它的 nome
.
结构:
typedef struct jogo
{
int id;
char equipas[2][1024];
int pont[2];
char nome[MAX_CHARS];
} jogo;
例如我和
nome: ucl ,
equipas[0]: fcb,
equipas[1]: bvb,
pont[0]: 2,
pont[1]
在 conj_jogs 的索引 1 处,如果我搜索字符串 UCL,我希望使用 bsearch 后具有该名称的 jogo 的 ID,即 1.
所以我为此创建了一个函数来创建一个 jogo 并将它们归因于 conj_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);
}
对于初学者,结构数组应按数据成员的值排序 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 ) );
}
好吧,你应该改行
result = bsearch("Elc",conj_gms, 4, sizeof(jogo),compare);
到
jogo const* result = bsearch("Elc",conj_gms, 4, sizeof(jogo),compare);