C 无法使用结构对日期进行排序

C 无法使用结构对日期进行排序,c,struct,C,Struct,我试图制作一个程序,以(月-日-年)的格式对日期列表进行排序,年是一年的最后两位数字。我的程序应该将日期排序为90到99年,然后是00到12年。我无法正确排序 例如,如果输入是这样的: 二零零一年一月一日 1990年6月30日 二零零一年十月一日 它应该把它归类为 二零零一年十月一日 二零零一年一月一日 1990年6月30日 #包括 #包括 /*最大字符数、最大天数、最大年份、最大大小的常数*/ 枚举{MAXC=12,MAX_DAY=31,MAX_YEAR=12,MAX_SIZE=1000};

我试图制作一个程序,以(月-日-年)的格式对日期列表进行排序,年是一年的最后两位数字。我的程序应该将日期排序为90到99年,然后是00到12年。我无法正确排序

例如,如果输入是这样的:

二零零一年一月一日

1990年6月30日

二零零一年十月一日

它应该把它归类为

二零零一年十月一日

二零零一年一月一日

1990年6月30日

#包括
#包括
/*最大字符数、最大天数、最大年份、最大大小的常数*/
枚举{MAXC=12,MAX_DAY=31,MAX_YEAR=12,MAX_SIZE=1000};
类型定义结构{
char month[MAXC];/*可以是静态的,也可以是单独分配的*/
未签名日;
未签字年份;
}日期;
/*stdin中剩余的空字符*/
无效空的\u stdin()
{
INTC;
而((c=getchar())!='\n'&&c!=EOF){}
}
/*按年份排序结构日期*/
整数排序(常量无效*a,常量无效*b)
{
日期*日期1=(日期*)a;
日期*日期2=(日期*)b;
如果(日期2->年份!=日期1->年份)
返回(date1->year->date2->year)-(date1->yearyear);
返回0;
}
/*输出struct date数组的n个元素*/
无效输出(日期*ar,整数n)
{
int i;
printf(“\n按年份排序的输出:\n\n”);
对于(i=0;i最大大小){/*无效输入>最大大小*/
fprintf(stderr,“错误:无效输入(n>%d)。\n”,最大大小);
goto tryagain;
}
break;/*如果我们在这里-我们有很好的价值,break*/
tryagain:;/*后藤跳过休息的标签*/
empty_stdin();/*保留在输入缓冲区中的空字符*/
}
empty_stdin();/*保留在输入缓冲区中的空字符*/
/*分配结构数组,n个元素*/
如果((ar=malloc(sizeof*ar*n))==NULL){
fprintf(stderr,“错误:虚拟内存耗尽。\n”);
返回1;
}
/*提供格式说明*/
//printf(“输入日期(月-日-年)\n”
//“格式,例如:2017年1月18日\n\n”);
对于(i=0;i
您可能理解:

if (date2->year != date1->year)
    return (date1->year > date2->year) - (date1->year < date2->year);
其中
fix_year()
如下所示:

int fix_year( int year )
{
    return (year >= 90? 2000 : 1900) + year;
}
这是另一种说法

int fix_year( int year )
{
    if( year >= 90 )
        return 1900 + year;
    return 2000 + year;
}

请注意,稍后您还必须删除
char month[MAXC];
成员,并将其替换为
int month;
,因为英语(以及我愿意猜测的任何语言)中月份名称的字典顺序绝对与月份的编号无关。

您可能了解:

if (date2->year != date1->year)
    return (date1->year > date2->year) - (date1->year < date2->year);
其中
fix_year()
如下所示:

int fix_year( int year )
{
    return (year >= 90? 2000 : 1900) + year;
}
这是另一种说法

int fix_year( int year )
{
    if( year >= 90 )
        return 1900 + year;
    return 2000 + year;
}

请注意,稍后您还必须删除
char month[MAXC];
成员,并将其替换为
int month;
,因为英语(以及我愿意猜测的任何语言)中月份名称的字典顺序绝对与月份的编号无关。

将其简化为a。我们不需要虹吸出不相关的部分。你自己可能会发现问题。执行
if(ar[i]。上一年的注释:
%u
-->
%02u
。如果你想要降序,
返回(date1->year>date2->year)-(date1->yearyear);
-->
返回(date1->yearyear)-(date1->year>date2->year)
我想这只是一个学习练习,但我的意见是永远不要使用两位数的年份。始终使用四位数的年份,尤其是在编写计算机程序时。将其缩减为a。不适合我们虹吸出不相关的部分。您可能会发现