【问题标题】:Time.h Providing Incorrect Answer in CTime.h 在 C 中提供不正确的答案
【发布时间】:2023-03-22 19:33:01
【问题描述】:

我有一个日期数组,目前是整数,格式为 {2010, 5, 13, 2010, 5, 15} 等等。我正在尝试使用 time.h 库来查找每个日期之间的天数差异。下面是一些描述出了什么问题的代码:

int main()
{
    int dates[] = {2010, 4, 14, 2010, 4, 15, 2010, 4, 16};
    int* pDates = dates;
    printf("%d\n", subtractDates(1, pDates));
    return 0;
}

int subtractDates(int i, int* pDates)
{
  struct tm start_date;
  struct tm end_date;
  time_t start_time, end_time;

  start_date.tm_hour = 0;  
  start_date.tm_min = 0;  
  start_date.tm_sec = 0;
  start_date.tm_mon = *(pDates+1)-1; 
  start_date.tm_mday = *(pDates+2); 
  start_date.tm_year = *(pDates)-1900;

  end_date.tm_hour = 0;  
  end_date.tm_min = 0;  
  end_date.tm_sec = 0;
  end_date.tm_mon = *(pDates+1+i*3)-1; 
  end_date.tm_mday = *(pDates+2+i*3); 
  end_date.tm_year = *(pDates+i*3)-1900;
  start_time = mktime(&start_date);
  end_time = mktime(&end_date);

  return difftime(end_time, start_time) / 86400;
}

此代码打印出提供的日期之间的差异是 1 天,这是正确的。但是,如果我删除数组中的第三个日期,如下所示,打印的值变为 0,我认为这是不正确的。

int main()
{
    int dates[] = {2010, 4, 14, 2010, 4, 15};
    int* pDates = dates;
    printf("%d\n", subtractDates(1, pDates));
    return 0;
}

int subtractDates(int i, int* pDates)
{
  struct tm start_date;
  struct tm end_date;
  time_t start_time, end_time;

  start_date.tm_hour = 0;  
  start_date.tm_min = 0;  
  start_date.tm_sec = 0;
  start_date.tm_mon = *(pDates+1)-1; 
  start_date.tm_mday = *(pDates+2); 
  start_date.tm_year = *(pDates)-1900;

  end_date.tm_hour = 0;  
  end_date.tm_min = 0;  
  end_date.tm_sec = 0;
  end_date.tm_mon = *(pDates+1+i*3)-1; 
  end_date.tm_mday = *(pDates+2+i*3); 
  end_date.tm_year = *(pDates+i*3)-1900;
  start_time = mktime(&start_date);
  end_time = mktime(&end_date);

  return difftime(end_time, start_time) / 86400;
}

考虑到我所做的只是删除数组中的三个值,而这三个值甚至没有在第一个程序中使用,我只是不明白为什么它返回 0。任何帮助将不胜感激,谢谢。

【问题讨论】:

  • 你不应该用%d打印doubles。
  • 所以,幸好你只是用它来打印整数。
  • 为我工作:ideone.com/lytPf4
  • 您应该检查来自mktime() 的返回并填写tm_isdst 成员,该成员当前正在传递给mktime() 未初始化并包含垃圾。如果您不花一点时间检查它们是否真的有效,那么您就没有道德权利期望它们会起作用。
  • 您正在使用difftime,它返回一个双精度,而不是一个整数。请通过将 return 语句更改为 return difftime(end_time, start_time) / 86400.0;、将函数的返回类型更改为 double 并将 printf 格式更改为 "%f" 来解决该问题

标签: c arrays date pointers time


【解决方案1】:

我遇到的问题是我将双精度数作为整数分配和返回。通过对此进行修改,我就能让我的代码正常工作。感谢所有帮助过的人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-10
    • 1970-01-01
    • 2018-11-30
    • 2019-05-01
    • 2016-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多