【问题标题】:Sorting a structure based on a date and time element根据日期和时间元素对结构进行排序
【发布时间】:2014-05-15 05:45:43
【问题描述】:

我有一个需要按升序排序的结构:

typedef struct CallLogSearchDataStruct
{
    char * date;
    char * time;
    char * bParty;
    char * aParty;
    float duration;
    char * cleardownCause;
    struct CallLogSearchOutboundStruct * outboundLegs;
    int maxDataCol;
} callLogSearchDataStruct;

我需要根据日期和时间升序对结构进行排序。日期和时间格式如下

日期:16/05/2011 时间:01:20:03

我需要按升序对上述两个字段进行排序,并且我一直在研究 qsort 但我想不出一种方法来做到这一点。我通过以下方式调用该函数。

qsort(callLogSearchData, dataRow, sizeof(callLogSearchDataStruct), sortCompare);

而我的功能如下

int sortCompare(const void * a, const void * b)
{
    const callLogSearchDataStruct *u1 = a;
    const callLogSearchDataStruct *u2 = b;

    if (u1->date < u2->date)
    {
        return -1;
    }
    else if (u1->date > u2->date)
    {
        return 1;
    }
    else
    {
        return 0;
    }

}

当我执行上面的代码时,它似乎没有对它进行排序,而是搞砸了结构的布局,即当我将结构的内容导出到文件时,一切都以错误的列顺序出现,而这很好,除了如果未完成比较则排序顺序错误。

【问题讨论】:

  • 有什么理由不将日期和时间存储在 unix timestamp format 中?您将节省内存,并且比较功能将很简单。
  • 现在,您不比较日期,而是比较指向日期的指针。
  • @Michael 主要是因为这是导出到文件时需要的日期格式
  • @Boardy,然后你可以在导出过程中使用ctime

标签: c sorting qsort


【解决方案1】:

您正在比较指针,这肯定不是您想要的。这是比较结构的一种方法:

  • 解析字符串并提取单个组件,例如年、月日等
  • 用所需的详细信息填写struct tm,然后致电mktime 就可以了
  • 此时您有 2 个 time_t 值,您可以使用 difftime 进行比较

这听起来需要做很多工作,而且确实如此!如果你愿意有点不便携,你可以试试美妙的strptime,它将字符串转换为struct tms。

【讨论】:

  • 我还提倡使用 yyyy/mm/dd 日期格式而不是 dd/mm/yyyy ,在这种情况下 strcmp(a-&gt;date, b-&gt;date) 可能就足够了。
  • @nos 是的,我想提到strcmp,但后来注意到格式不适合那个。确实,使用您提到的格式,甚至将字符串转换为该格式,然后调用strcmp 无疑是一种明智的方法。感谢您的评论:-)
【解决方案2】:

您似乎在比较字符指针并基于此做出决定。但是您必须比较日期和时间值才能进行排序。 因为它们都是字符串,你应该解析字符串,在不同的变量中获取年、月、日、小时、秒。 现在你可以使用

mktime()

它将以 time_t 格式返回给您。现在您可以轻松地比较它们并进行相应的排序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-24
    • 2020-05-29
    • 1970-01-01
    • 1970-01-01
    • 2017-06-02
    • 1970-01-01
    • 2015-03-31
    相关资源
    最近更新 更多