我有一个结构数组,已经使用qsort
. 我正在尝试在 struct 中搜索名称,但它总是返回NULL
。为什么会发生这种情况的解释是什么?
这是我的代码:
#include "card.h"
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
int cmpname (const void *pa, const void *pb) {
const char *p1 = pa;
const index_t * const *p2 = pb;
//printf("Comparing: %s %s\n", p1, (char*)*p2);
return strcmp((p1), (*p2)->name);
}
int main(int argc, char **argv)
{
unsigned length;
int i = 0;
int length_multiplier = 0;
char *input = NULL;
char *pItem;
index_t **indexs = NULL;
FILE *input_file;
if((input_file = fopen("index.bin", "rb")) != NULL)
{
// GETS USER INPUT
printf(">> ");
size_t num_read = 0;
getline(&input, &num_read, stdin);
printf("Searching for: %s\n", input);
if(*input != 113)
{
// READING FILE AND ADDING ENTRIES INTO STRUCT
//int *key;
//int *pItem;
//input_file = fopen("index.bin", "rb");
if (input_file == NULL)
{
printf("ERROR OPENING FILE\n");
free(indexs);
fclose(input_file);
return 1;
}
// READS THE INPUT FILE
for(i = 0; fread(&length, sizeof(unsigned int), 1, input_file) != 0; i++)
{
length_multiplier++;
indexs = realloc(indexs, sizeof(index_t *) * length_multiplier);
indexs[i] = malloc(sizeof(index_t));
indexs[i]->name = malloc(sizeof(char) * length + 1);
fread(indexs[i]->name, sizeof(char), length, input_file);
indexs[i]->name[length] = 0;
fread(&indexs[i]->offset, sizeof(long), 1, input_file);
}
for(i = 0; i < length_multiplier; i++)
{
printf("%s\n", indexs[i]->name);
}
printf("Searching for: %s\n", input);
pItem = (char*) bsearch(&input, indexs, length_multiplier, sizeof(indexs), cmpname);
if(pItem == NULL)
{
printf("%s not found\n", pItem);
}
else
{
printf("found %s\n", pItem);
}
//FREEING MEMORY
for(int i = 0; i < length_multiplier; i++)
{
free(indexs[i]->name);
free(indexs[i]);
}
free(indexs);
free(input);
//fread(card[0]->id, sizeof(u_int32_t), 1, input_file);
fclose(input_file);
return 0;
}
else
{
printf("Exiting...\n");
return 1;
}
}
else
{
fprintf(stderr, "./parser: cannot open(%s%s%s): No such file or directory", "\"", argv[1], "\"");
return 1;
}
}
这是我声明的结构:
typedef struct index {
char *name;
long offset;
} index_t;