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

西望

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

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

一月 1 01

6 月 30 日 90

10 月 1 日 01

它应该将其排序为

10 月 1 日 01

一月 1 01

6 月 30 日 90

#include <stdio.h>
#include <stdlib.h>

/* constants for max chars, max day, max year, max size */
enum { MAXC = 12, MAX_DAY = 31, MAX_YEAR = 12, MAX_SIZE = 1000 };

typedef struct {
    char month[MAXC];   /* either make static or allocate separately */
    unsigned day;
    unsigned year;
} date;

/* empty character remaining in stdin */
void empty_stdin ()
{
    int c;
    while ((c = getchar ()) != '\n' && c != EOF) {}
}

/* sort struct date on year */
int sort (const void *a, const void *b)
{
    date *date1 = (date *) a;
    date *date2 = (date *) b;

    if (date2->year != date1->year)
        return (date1->year > date2->year) - (date1->year < date2->year);






    return 0;
}

/* output n elements of array of struct date */
void output (date *ar, int n)
{
    int i;

    printf ("\nOutput sorted by year:\n\n");

    for (i = 0; i < n; i++)
        printf ("  %s %d %d\n", ar[i].month, ar[i].day, ar[i].year);
}

int main (void) {

    int i, n;
    date *ar = NULL;

    while (1) {     /* obtain valid 'n', compare with using fgets below */

        int rtn; /* varaible to save return of scanf -- always validate */

        //printf ("Enter number of dates to be entered (between 1 & 1000): ");
        if ((rtn = scanf ("%d", &n)) != 1) {   /* if conversion failed */
            if (rtn == EOF) {   /* test for user cancelation of input */
                fprintf (stderr, "note: user canceled input, exiting.\n");
                return 0;
            }                   /* otherwise simply an invalid input */
            fprintf (stderr, "error: invalid input.\n");
            goto tryagain;
        }

        if (n < 0) {            /* invalid input < 0 */
            fprintf (stderr, "error: invalid input (n < 0).\n");
            goto tryagain;
        }

        if (n > MAX_SIZE) {     /* invalid input > MAX_SIZE */
            fprintf (stderr, "error: invalid input (n > %d).\n", MAX_SIZE);
            goto tryagain;
        }

        break;      /* if we are here - we have a good value, break */

      tryagain:;    /* label for goto to jump over break */

        empty_stdin ();   /* empty characters that remain in input buffer */
    }

    empty_stdin ();     /* empty characters that remain in input buffer */

    /* allocate array of struct ar, n elements */
    if ((ar = malloc (sizeof *ar * n)) == NULL) {
        fprintf (stderr, "error: virtual memory exhausted.\n");
        return 1;
    }

    /* provide format instructions */
    //printf ("Enter the date (month day year)\n"
           // "  format, e.g.:  Jan 18 2017\n\n");

    for (i = 0; i < n;) {   /* loop until all elements filled */

        char buf[MAX_DAY + 1] = "", ans[MAXC] = "";

        //printf (" date[%2d] : ", i + 1);    /* prompt for input */

        /* if fgets return is NULL, EOF encountered */
        if (fgets (buf, MAX_DAY + 1, stdin) == NULL) {
            fprintf (stderr, "note: user canceled input, exiting.\n");
            return 0;
        }

        if (*buf == '\n') { /* if first char is '\n', user just hit enter */
            printf ("no input provided, quit (y/n)? ");
            if (fgets (ans, MAXC, stdin) && (*ans == 'y' || *ans == 'Y'))
                return 0;
            else if (!*ans) {   /* if ans NULL, EOF encountered */
                fprintf (stderr, "note: user canceled input, exiting.\n");
                return 0;
            }
        }

        /* parse with sscanf, validate 3 conversion took place */
        if (sscanf (buf, "%11s %u %u", ar[i].month, &ar[i].day, &ar[i].year) != 3)
        {
            fprintf (stderr, "error: invalid input.\n");
            continue;
        }

        i++;    /* only increment if valid sscanf conversion took place */
    }

    qsort (ar, n, sizeof (date), sort);     /* sort by year */

    output (ar, n);     /* output results */

    free (ar);      /* free ar - you allocate it, you free it */

    return 0;
}
迈克·纳基斯

你可能明白这一点:

if (date2->year != date1->year)
    return (date1->year > date2->year) - (date1->year < date2->year);

没有任何意义。

这是你想要的:

int year1 = fix_year( date1->year );
int year2 = fix_year( date2->year );
return year1 - year2;

其中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];成员并将其替换为 anint month;因为英语中月份名称的字典顺序(以及我愿意猜测的地球上的任何语言)与月份的编号。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用asort()对日期进行排序的数组无法正常工作

来自分类Dev

无法使用 Order by Clause 对日期进行排序

来自分类Dev

使用Chartwrapper类时对日期类型的列进行排序

来自分类Dev

Python:使用Lambda以str格式对日期时间进行排序

来自分类Dev

如何使用比较器按降序对日期进行排序

来自分类Dev

如何使用AM | PM对日期文件进行排序

来自分类Dev

使用dd / mm / yyyy格式的JavaScript对日期进行排序

来自分类Dev

使用asort()对日期数组进行排序

来自分类Dev

Tablesorter使用相对日期列对表进行排序

来自分类Dev

使用熊猫对日期进行年月排序

来自分类Dev

使用Lambda表达式对日期进行排序

来自分类Dev

如何使用AM | PM对日期文件进行排序

来自分类Dev

使用 JavaScript 以字符串格式对日期进行排序

来自分类Dev

XSLT:如何对日期进行排序

来自分类Dev

按升序对日期进行排序

来自分类Dev

在AngularJS前端中对日期进行排序

来自分类Dev

对日期数组进行排序

来自分类Dev

根据当前日期对日期数组进行排序

来自分类Dev

用0的月份或日期对日期进行排序

来自分类Dev

如何使用jQuery在asp.net ListBox中对日期进行排序

来自分类Dev

如何在CellTable GWT中使用空单元格对日期列进行排序

来自分类Dev

如何使用数组中的 moment.js 按降序对日期进行排序

来自分类Dev

使用PHP对日期进行分组

来自分类Dev

如何使用 XSLT 对日期进行分区

来自分类Dev

MongoDb:如何对日期字段进行汇总,分组和排序?

来自分类Dev

Powershell-按日期对日志行进行排序

来自分类Dev

如何在jQuery中对日期进行排序

来自分类Dev

对日期为JavaScript的字符串数组进行排序

来自分类Dev

您如何在字典中对日期进行排序?

Related 相关文章

  1. 1

    使用asort()对日期进行排序的数组无法正常工作

  2. 2

    无法使用 Order by Clause 对日期进行排序

  3. 3

    使用Chartwrapper类时对日期类型的列进行排序

  4. 4

    Python:使用Lambda以str格式对日期时间进行排序

  5. 5

    如何使用比较器按降序对日期进行排序

  6. 6

    如何使用AM | PM对日期文件进行排序

  7. 7

    使用dd / mm / yyyy格式的JavaScript对日期进行排序

  8. 8

    使用asort()对日期数组进行排序

  9. 9

    Tablesorter使用相对日期列对表进行排序

  10. 10

    使用熊猫对日期进行年月排序

  11. 11

    使用Lambda表达式对日期进行排序

  12. 12

    如何使用AM | PM对日期文件进行排序

  13. 13

    使用 JavaScript 以字符串格式对日期进行排序

  14. 14

    XSLT:如何对日期进行排序

  15. 15

    按升序对日期进行排序

  16. 16

    在AngularJS前端中对日期进行排序

  17. 17

    对日期数组进行排序

  18. 18

    根据当前日期对日期数组进行排序

  19. 19

    用0的月份或日期对日期进行排序

  20. 20

    如何使用jQuery在asp.net ListBox中对日期进行排序

  21. 21

    如何在CellTable GWT中使用空单元格对日期列进行排序

  22. 22

    如何使用数组中的 moment.js 按降序对日期进行排序

  23. 23

    使用PHP对日期进行分组

  24. 24

    如何使用 XSLT 对日期进行分区

  25. 25

    MongoDb:如何对日期字段进行汇总,分组和排序?

  26. 26

    Powershell-按日期对日志行进行排序

  27. 27

    如何在jQuery中对日期进行排序

  28. 28

    对日期为JavaScript的字符串数组进行排序

  29. 29

    您如何在字典中对日期进行排序?

热门标签

归档