You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

C语言公历日历程序问题:有效日期未执行星期打印直接终止

问题排查与解决方案

嘿,我来帮你揪出这个问题的根源!你遇到的情况——有效日期也直接终止程序不打印星期——大概率是代码里的return 0;语句位置不对,或者日期有效性判断逻辑出了问题,下面详细拆解:

最可能的原因:return 0;提前终止了程序

你说无效日期时退出正常,但有效日期也直接终止,很大概率是你在日期有效性检查的代码之后,误加了return 0;,或者把打印星期的代码放在了return语句的后面。举个典型的错误示例:

// 错误的代码结构
if (日期无效) {
    printf("Wrong year/month/day");
    return 0;
}
return 0; // 这里直接退出!有效日期也走了这一步,根本没执行打印逻辑
// 打印星期的代码永远到不了
printf("%s", week_day);

正确的做法应该是:只有当日期无效时才执行return 0;,有效日期的分支要继续执行星期计算和打印代码,最后再统一return 0;

另一个可能:日期有效性判断逻辑误判了有效日期

你测试的1583.3.31是格里高利历的有效日期,但如果你的判断逻辑有问题,可能会把它误判为无效,执行return 0;,但你没看到错误输出(比如printf没加换行符,导致输出被缓冲没显示)。要排查这点:

  • 检查年份判断:格里高利历从1582年10月15日开始生效,1583年是合法的,你的代码是否把起始年份设成了1584或更高?
  • 检查月份天数判断:3月有31天,你的代码是否错误限制了3月的最大天数为30?
  • 给错误输出加换行:把printf("Wrong year/month/day");改成printf("Wrong year/month/day\n");,强制刷新缓冲区,确认是否真的误判了日期。

修正后的代码示例

这里给你一个结构正确的代码片段参考,确保有效日期能执行到打印逻辑:

#include <stdio.h>

int main() {
    int year, month, day;
    // 假设这里是输入日期的逻辑,比如scanf("%d.%d.%d", &year, &month, &day);
    year = 1583;
    month = 3;
    day = 31;

    // 第一步:基础有效性检查
    if (year < 1583 || month < 1 || month > 12 || day < 1) {
        printf("Wrong year/month/day\n");
        return 0;
    }

    // 第二步:检查对应月份的最大天数
    int max_day;
    switch(month) {
        case 2:
            // 闰年判断逻辑
            if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
                max_day = 29;
            } else {
                max_day = 28;
            }
            break;
        case 4: case 6: case 9: case 11:
            max_day = 30;
            break;
        default:
            max_day = 31; // 1、3、5、7、8、10、12月都是31天
            break;
    }

    if (day > max_day) {
        printf("Wrong year/month/day\n");
        return 0;
    }

    // 到这里日期完全有效,执行星期计算逻辑(比如Zeller公式)
    // 这里示例直接输出已知的结果,你替换成自己的计算代码即可
    printf("Thursday\n");

    // 最后再退出程序
    return 0;
}

内容的提问来源于stack exchange,提问作者박혜지

火山引擎 最新活动