我想在日期数组中搜索一个日期(这是一个结构)以查看它是否在其中。这是我第一次使用 bsearch,它总是返回相同的结果,0,而它应该返回 null 或指向找到的日期的指针。我正在使用与对数组进行排序时相同的比较函数,并且排序工作正常。我猜如果函数返回 0 表示它已经在数组中找到日期。我做错了什么?如果错误不明显,我可以发布完整的代码。
#define MIN_SIZE 0
#define MAX_SIZE 10000
#define MAX_MONTH_STR 9
#define SWAP 1
#define NO_SWAP -1
#define EQUAL 0
//Define a struct data type
typedef struct
{
//Declaration of struct members
char* month;
int day;
int year;
}date;
//Method to allocate memory for a list of date structures
date* allocateStruct(int size)
{
//Declaration of variables
date *array;
int i;
//Allocate memory for array to store 'size' many 'date' struct data types
array = malloc(size*sizeof(date));
//For-loop to allocate memory for each struct's members and initialize them to zero
for (i=0; i<size; i++)
{
array[i].month = calloc(MAX_MONTH_STR,sizeof(char));
array[i].day = (int) calloc(1,sizeof(int));
array[i].year = (int) calloc(1,sizeof(int));
}
return array;
}
//Method to free memory allocated
void freeStruct(date* array, int size)
{
//Declaration of variable
int i;
//For-loop to free up struct members
for (i=0; i<size; i++)
{
free(array[i].month);
free(&array[i].day);
free(&array[i].year);
}
//Free up structs
free(array);
}
//Method to compare two dates
int cmpDates (const void *a, const void *b)
{
//Declaration and dereference of variables
date first = *(date*)a;
date second = *(date*)b;
int y_result, m_result, d_result;
//Calculate results
y_result = second.year-first.year;
m_result = second.month-first.month;
d_result = second.day-first.day;
//If-statements to determine whether to swap dates based on year
//If-statement to determine whether both years are in 90s group
if (first.year>=90 && first.year<=99 && second.year>=90 && second.year<=99)
{
//If-statement to determine whether years are equal
if (y_result!=0)
{
return (y_result);
}
}
//Else-if-statement to determine whether both years are in 00-12 group
else if (first.year>=0 && first.year<=12 && second.year>=0 && second.year<=12)
{
//If-statement to determine whether years are equal
if (y_result!=0)
{
return (y_result);
}
}
//Otherwise the two years belong to different year groups
else
{
//If-statement to determine whether first year belongs to 00-12 group
if (first.year>=0 && first.year<=12)
{
return NO_SWAP;
}
else
{
return SWAP;
}
}
//If-statement to determine whether to swap dates based on months
if (m_result!=0)
{
return m_result;
}
//If-statement to determine whether to swap dates based on days
if (d_result!=0)
{
return d_result;
}
//If dates are exactly the same
return EQUAL;
}
enum months {
January=1,
February,
March,
April,
May,
June,
July,
August,
September,
October,
November,
December
};
int main()
{
//Declaration of variables
int n; //number of dates in array
date* date_list; //array of dates
date *key_date; //date to search for
date *q_result; //result of search
//Read input
do
{
//printf("Enter number of dates you want to enter (between 1 and 10000):\n");
scanf("%d", &n);
}while(n<MIN_SIZE || n>MAX_SIZE);
//Allocate memory for an array of n dates
date_list = allocateStruct(n);
//For-loop to store values in 'date_list'
for (i=0; i<n; i++)
{
//printf("Enter the date (month day year) in the following format <text number number>:");
scanf("%s", date_list[i].month);
scanf("%d", &date_list[i].day);
scanf("%d", &date_list[i].year);
}
//Allocate memory for one date
key_date = allocateStruct(1);
//Read date for query
//printf("Enter date you want to query:");
scanf("%s", key_date->month);
scanf("%d", &key_date->day);
scanf("%d", &key_date->year);
//Sort the array with built-in function qsort
qsort(date_list, n, sizeof(date), cmpDates);
//Print list of sorted dates
for (i=0; i<n; i++)
{
//printf("Enter the date (month day year) in the following format: text number number");
printf("%s ", date_list[i].month);
printf("%d ", date_list[i].day);
printf("%02d\n", date_list[i].year); //need & ?
}
//Query with bsearch --> I TRIED BOTH OF THESE LINES BUT THE RESULT WAS THE SAME
q_result = (date*) bsearch(&key_date, date_list, n, sizeof(date), cmpDates);
// q_result = bsearch(&key_date, date_list, n, sizeof(date), cmpDates);
//Printing answer to query
if(q_result!=NULL)
{
printf("Yes in list");
}
else
{
printf("No not in list");
}
}