【问题标题】:C - calculate all dates from Year X to Year YC - 计算从 X 年到 Y 年的所有日期
【发布时间】:2023-03-31 03:44:02
【问题描述】:

请忽略,无能是最好的!

实际上只是在一些嵌套的 for 循环中弄乱了一些基本的文件 i/o,但输出并不是我想要的,尽管我似乎无法让它工作。

#include <stdio.h>

int main(void) {
FILE *pFile;
pFile = fopen("dates.txt", "w");
int day, month, year;
for(day = 1; day <= 31; day++) {
 for(month = 1; month <= 12; month++) {
   for(year = 1900; year <= 2050; year++) {
 if(day < 10 && month < 10) {
   fprintf(pFile, "0%d/0%d/%d\n", day, month, year);
 }else {
   fprintf(pFile, "%d/%d/%d\n", day, month, year);
 }
   }
 }
 }
 return 0;
}

非常感谢任何提示!请注意,这不是家庭作业,实际上只是一些实验。

干杯。

【问题讨论】:

  • 别忘了免费pFile
  • 尝试%02d作为格式规范,它会为您节省中间的if
  • @Adban: free()?您可能想到了fclose()。好点子。
  • 您将在 2 月、4 月、6 月、9 月和 11 月有太多的日子。最好使用像下面的 Shiplu 这样的解决方案。
  • 你说输出不是你想要的。你想要什么?没有这些信息有点难以回答。

标签: c for-loop printf


【解决方案1】:

您可以使用mktime 创建日期。然后添加 1 天并创建下一个日期。 这样你就可以迭代了。

以下代码显示前 200 个日期。

#include <time.h>
#include <stdio.h>

int main(){
    struct tm *lt;

    int i=200;

//time_t t=0;  // first second on epoch
    time_t t=-2209010000; // first second on 1900 (works on GCC, dind't test MSVS compiler)

    while(i--){
        lt = localtime(&t);
        printf("YYYY:MM:DD = %04d:%02d:%02d\n", lt->tm_year+1900, lt->tm_mon+1,     lt->tm_mday);
        lt->tm_hour+=24; // adding 24 hours
        t = mktime(lt);
    }
    return 0;
}

顺便说一下,它工作的日期落后于 epoch。至少在我的gcc version 4.4.3x86_64 GNU/Linux

【讨论】:

  • 在纪元之前的日期(太远)不工作可能是个问题,尤其是在 32 位系统上,向后拉伸会让你回到大约 1901 年 12 月 13 日星期五(有些人不走运!) .同样向前推进; 32 位系统在 2038 年 1 月用完 1970-01-01 00:00:00 +00:00 的纪元。所需范围 (1900-2050) 超出了这些限制。在 64 位系统上,您可能会没事。
  • @JonathanLeffler 查看更新。它显示 1900 年的日期。是由于 64 位 Linux 造成的吗?我不确定。我所有的系统都是 64 位的。
  • 是的 - 像 MacOS X 这样的 64 位系统向后(超过?)公元 1 年 (CE) 和超过公元 9999 年 (CE) 都可以正常工作。 32 位系统被限制在纪元两侧的 ±68 年(大约一个月左右)。当我说“32 位系统”时,我指的是 time_t 是 32 位有符号类型的系统(大多数 32 位系统都是这种情况)。
【解决方案2】:

实际上,您可以有 4 种日期和月份的组合,其中您可能会或可能不会以 0 为前缀,而您尝试使用 single if else 来处理。

案例1:日月都

案例 2:日 > 10 和月

案例 3:日 10,未处理

案例 4:两者都 > 10。在 else 中处理。

%02d 是处理所有情况的选项。

【讨论】:

    【解决方案3】:

    您可能希望年循环在月循环之前在日循环之前(与当前顺序相反)。

    您将需要更聪明地测试一个月中的最大天数(您需要了解闰年的规则(注意 1900 年不是闰年,使用 MS Excel,而 2000 年是)。

    您可以使用%02d%.2d 打印2 位数字的月份和日期,因此您只需要一个printf() 语句。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-09
      • 2010-11-09
      • 1970-01-01
      • 1970-01-01
      • 2016-07-14
      • 1970-01-01
      • 1970-01-01
      • 2020-03-26
      相关资源
      最近更新 更多