计算两日期间隔天数的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
相关产品推荐
相关产品推荐

