You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

计算两日期间隔天数的C函数出现意外输出问题排查

日期计算C语言函数的问题分析

问题背景

我编写了一段用于计算两个用户输入日期间隔天数的C语言函数,代码如下:

//A function that counts days from a given date to a given date
int count_days_from(int start_day, int start_month, int day, int month, int year){
    
    //DECLARATION AND INITIALIZATION SEGMENT
    int month_days[12] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    int days = 0;

    //CALCULATIONS
    for(int i = start_month; i < month; i++)
        days = days + month_days[i];
    days = days + (month_days[month] - day);  
    
    
    return days;
}

测试时调用语句为 printf("%d\n", count_days_from(1, 1, 31, 12, 2024));,得到意外输出结果 1915424856,以下是函数存在的问题:


1. 数组下标越界(直接引发异常输出)

C语言数组下标从0开始,month_days数组的有效下标范围是0到11(分别对应1月到12月)。测试用例中传入的month值为12,代码中访问month_days[month]等价于访问month_days[12],这超出了数组的有效内存范围,属于未定义行为,会读取内存中的随机垃圾值,最终导致输出异常的整数。

2. 关键参数未被利用,逻辑缺失

  • start_day参数完全未被使用:如果起始日期不是当月1号(例如从1月5日开始计算),代码无法扣除起始日之前的天数,计算结果必然偏差。
  • year参数未被使用:代码固定将2月天数设为29天,但只有闰年的2月才有29天,平年应为28天,不根据年份判断会导致平年的日期计算错误。

3. 核心计算逻辑错误

当前代码的逻辑仅能覆盖极端特殊场景,且本身存在错误:

  • 循环for(int i = start_month; i < month; i++)中,start_month传入的是1(对应1月),但数组下标0才代表1月,因此循环会从i=1(对应2月)开始累加,直接漏掉了1月的天数。
  • days = days + (month_days[month] - day)的逻辑完全错误:这行代码计算的是“当月总天数减去结束日”,但我们需要的是从起始日到结束日的间隔天数,逻辑方向完全颠倒。

4. 未处理跨年度场景

如果起始日期和结束日期不在同一年(例如2023年12月到2024年1月),当前代码的循环不会执行,也没有任何逻辑处理跨年的整年天数,计算结果必然错误。


内容的提问来源于stack exchange,提问作者anonymouscake20000000

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 06:02:05