我正在做一个C程序来使用内置的qsort函数对用户按时间顺序输入的日期进行排序 . 我正在使用结构 . 但是我的代码没有正确排序 . 有帮助吗?这是我在qsort中调用的一些代码 .
int comparator(const void *p, const void *q)
{
int l3 = ((struct dates *)p)->year;
int r3 = ((struct dates *)q)->year;
if(l3 >= 90 || l3<=99 ){
if(l3 > r3){
return 1;
}
else if(l3 < r3){
return -1;
}
}
else if(l3 > 99){
if(l3 > r3){
return 1;
}
else if(l3 < r3){
return -1;
}
}
int l2 = stringtoInt(((struct dates *)p)->month);
int r2 = stringtoInt(((struct dates *)q)->month);
if (l2 > r2)
{
return 1;
}
else if ( l2 < r2)
{
return -1;
}
int l = ((struct dates *)p)->day;
int r = ((struct dates *)q)->day;
if (l > r)
{
return 1;
}
else if ( l < r)
{
return -1;
}
}
3 回答
发布的代码似乎假设年份字段只有2位数 . 这是一个有效的假设吗?
这一行:
是不正确的,因为2位数'应该'永远不会超过99 .
(我建议使用4位数年份,但这是您的数据设计选择)
然而,似乎如果年份不在90-99的范围内,那么它必须在新世纪
所以不需要检查年份是否> 99,只是假设它是在新世纪 .
当一个日期在上个世纪(90 ... 99)而另一个日期是在下个世纪时会发生什么?代码似乎没有考虑到这种情况 .
你的第一个if构造,
将始终评估为true,因此永远不会输入以下
else if
. 我假设条件是l3 >= 90 && l3 <= 99
,虽然如果是这种情况,因为以下else if
具有相同的主体,您可以将它们合并为单个if语句if (l3 >= 90)
.此外,您没有处理
l3 < 90
的情况,因此在这种情况下,您的比较器将忽略年份并继续按月和日进行比较 .当确定日期相等时,我还会在函数末尾添加一个显式
return 0
.I was working on a schedule maker program so here's the code i have used to sort dates