c - 日期比较程序

标签 c

谁能发现我的代码有什么问题? 它应该简单地比较日期并且应该记录最早的日期,但是只有我的第一个输入是。慢慢走过来也看不出我的逻辑错误在哪里。

#include <stdio.h>

int main(void)
{
   int month=1, day=1, year=1;
   int fmonth=0, fday=0, fyear=0;

   while((month != 0) && (day != 0) && (year != 0))
   {
      printf("Enter the date: (0/0/0 to cancel) ");
      scanf("%d/%d/%d", &month, &day, &year);
      if(fyear < year)
      {
         fyear = year;
         fmonth = month;
         fday = day;
      }
      else if ((fyear == year) && (fmonth < month) && (fday <= day))
      {
         fyear=year;
         fmonth=month;
         fday=day;
      }
   }

   printf("Earliest Date is: %d/%d/%d\n", fmonth,fday,fyear);

   return 0;
}

最佳答案

哈,这有点有趣。您的主要问题是您的比较倒退了。 (并且您需要添加一个 (month == fmonth) 测试)您的次要问题是验证用户输入 完全失败——它每次都会困扰您。

首先,您要检查 (date < fdate) 是否为在分配之前,不是 if (fdate < date)否则您将用较晚的日期覆盖较早的日期(如 yuchaun 最初正确指出的那样)。

始终,始终验证用户输入。众所周知,一只猫可能正在踩键盘。至少,至少检查 scanf 的返回验证转换为 int 的次数您期望的,确实发生了(验证值落入有效月、日、年范围内的任务留给您)。

将这些部分放在一起,并替换 "0/0/0"使用一个简单的计数器取消以确定您何时输入了两个日期,您可以执行类似的操作:

#include <stdio.h>

int main (void) {

    int month = 1, day = 1, year = 1,
        fmonth = 0, fday = 0, fyear = 0,
        n = 0;  /* simple counter - no need for 0/0/0 */

    while (1) { /* just loop until you have 2 dates */
        printf ("Enter the date: ");

        /* validate ALL User Input */
        if (scanf ("%d/%d/%d", &month, &day, &year) != 3) {
            fprintf (stderr, "error: invalid date, exiting.\n");
            return 1;
        }

        /* if no fdate or if (date < fdate) then fdate = date */
        if (!n || (year < fyear) || 
            ((year == fyear) && ((month < fmonth) || 
            ((month == fmonth) && (day < fday))))) {
            fyear = year;
            fmonth = month;
            fday = day;
        }
        if (++n == 2)   /* increment counter and test */
            break;
    }

    printf ("Earliest Date : %d/%d/%d\n", fmonth, fday, fyear);

    return 0;
}

示例使用/输出

$ ./bin/earlierdate
Enter the date: 12/21/1991
Enter the date: 12/22/1991
Earliest Date : 12/21/1991

$ ./bin/earlierdate
Enter the date: 12/22/1991
Enter the date: 12/21/1991
Earliest Date : 12/21/1991

当你遇到这样的问题时,总是看到How to debug small programs并且不要羞于与鸭子交谈......它有效!

查看所有内容,考虑所有答案,如果您有任何其他问题,请告诉我。

关于c - 日期比较程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45396405/

相关文章:

c - 修改windows中socket缓冲区大小的默认值

c++ - 在 C++ 和 C 中的现有选项卡中打开 URL

c - MPI_Datatype 的动态数组

c - DEoptim 在 R 中似乎卡住

c - 如何从 C/C++ 中的当前语言环境获取短日期格式字符串?

c - C 中的对象数组

c - 在 C 中调用 crypt 函数时出现段错误

c - 为什么下面的代码不能修改指针数组中的字符串?

c - 如何扫描带有空格的字符串并打印它们 C

c - 查找 2 个字符串是否由相同单词组成的函数