题目

日期结构体:判断是否合法日期

思路

y,m,d,校验月日范围,2 月用闰年天数;daysInMonth(y,m) 辅助函数返回该月最大日。

解题分析

月份 1~12,日期不超过当月天数,2 月看闰年。不要用固定 2 月 28 判所有年份。

完整程序

#include <stdio.h>

static int is_leap(int y)
{
    return (y % 400 == 0) || (y % 4 == 0 && y % 100 != 0);
}

static int days_in_month(int y, int m)
{
    int d[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
    if (m == 2 && is_leap(y)) {
        return 29;
    }
    return d[m];
}

int main(void)
{
    int y, m, d;
    if (scanf("%d %d %d", &y, &m, &d) != 3) {
        return 1;
    }
    if (m < 1 || m > 12 || d < 1 || d > days_in_month(y, m)) {
        printf("no\n");
    } else {
        printf("yes\n");
    }
    return 0;
}

运行示例

输入:

2024 2 29

输出:

yes