我必须解决几个C问题,其中大多数都涉及到必须在某处使用qsort(),但无论我从网上获得多少帮助我都无法让它工作。 以此代码为例:
#include <stdio.h>
#include <string.h>
struct date
{
int day;
int month;
int year;
};struct date d[5]={
{12,12,2012},
{23,02,2014},
{31,01,2222},
{32,21,2011},
{12,01,1990}
};
int compare(const void * a, const void * b)
{
struct date *orderA = (date *)a;
struct date *orderB = (date *)b;
return ( orderA->year -orderB->year );
}
int main()
{
int i;
qsort(d,5,sizeof(date),compare);
for(i=0;i<5;i++)
printf("%d %d %d\n",d[i].day,d[i].month,d[i].year);
return 0;
}
我收到的错误是日期未申报,即使已经存在。我根本无法理解比较功能,必须从网上复制它们。请帮帮我。我在大学的老师是一个完全愚蠢的人。
答案 0 :(得分:1)
date
不是一种类型。 struct date
是。在引用结构类型时,您需要使用struct
关键字。
此外,如果您将比较函数中的指针定义为const
,则无需投射。
const struct date *orderA = a;
const struct date *orderB = b;
答案 1 :(得分:0)
您的代码存在轻微问题:您需要包含stdlib.h
(适用于qsort()
),但您未在示例中使用string.h
;您使用date
作为结构和类型但不要定义它 - 您可以通过typedef
同时将其定义为两者;如果你愿意,你可以将你的比较扩展到数年之后。
针对上述问题重新编写代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct date {
int day;
int month;
int year;
} Date;
int compare(const void *a, const void *b) {
const Date *date_A = a;
const Date *date_B = b;
return date_A->year == date_B->year ?
date_A->month == date_B->month ?
date_A->day - date_B->day
: date_A->month - date_B->month
: date_A->year - date_B->year;
}
int main() {
Date dates[] = {
{12, 12, 2012},
{23, 02, 2014},
{31, 01, 2222},
{32, 21, 2011},
{12, 01, 1990}
};
size_t count = sizeof(dates) / sizeof(Date);
qsort(dates, count, sizeof(Date), compare);
for (int i = 0; i < count; i++) {
Date *date = &dates[i];
printf("%d %d %d\n", date->day, date->month, date->year);
}
return 0;
}