首页 > 解决方案 > 如何检查在C中以dd-mm-yyyy形式输入日期的数字?

问题描述

我们可以检查日期输入表单 dd-mm-yyyy 并检查用户输入的数字吗?例如用户输入 7-7-2000,无效,必须是 07-07-2000。

这是我的代码。

int dateCheck(int argc, const char * argv[]){

int day;
int month;
int year;
int count = 0;
char inputValue[20];
printf("Enter date : ");
fgets(inputValue, sizeof(inputValue), stdin);
sscanf(inputValue, "%d-%d-%d",&day,&month,&year);

if ((year >= 1919) && (year <= 2119)) {

        if ((month >= 1) && (month <= 12)) {

            if ( ((day >= 1) && (day <= 31)) && ((month == 1) || (month == 3) || (month == 5) || (month == 7) || (month == 9) || (month == 11)) ) {
                printf("Valid.\n");
            }
            else if ( ((day >= 1) && (day <= 30)) && ((month == 4) || (month == 6) || (month == 8) || (month == 10) || (month == 12)) ){
                printf("Valid.\n");
            }
            else if ( ((day >= 1) && (day <= 28)) && (month == 2) ){
                printf("Valid.\n");
            }
            else if ( (day == 29) && (month == 2) && ( (year%400 == 0) || ((year%4 == 0) && (year%100 != 0)) ) ){
                printf("Valid.\n");
            }
            else{
                printf("Invalid.\n");
            }
        }
        else{
            printf("Invalid.\n");
        }
    }
    else{
        printf("Invalid.\n");
    }

标签: c

解决方案


我们可以检查日期输入表单 dd-mm-yyyy 并检查用户输入的数字吗?

当然,使用一些辅助函数怎么样?

将任务划分为概念部分并为每个部分编写代码。分而治之。

// return 0: fail
// return 1: success
static int scan_int(int *dest, const char *s, int min, int max, int digits,
    char endchar) {
  *dest = 0;
  for (int i = 0; i < digits; i++) {
    if (*s < '0' || *s > '9')
      return 0;
    *dest = *dest * 10 + *s - '0';
    s++;
  }
  return *dest >= min && *dest <= max && *s == endchar;
}

static int isleapyear(int year) {
  if (year % 4) return 0;
  if (year > 1582) {  // see https://en.wikipedia.org/wiki/Gregorian_calendar
    if (year % 100 == 0 && year % 400) return 0;
  }
  return 1;
}

static int eom(int year, int month) {
  static char eoms[1 + 12] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
  if (month != 2) {
    return eoms[month];
  }
  return eoms[month] + isleapyear(year);
}

现在配备了一些辅助功能,任务被直接编码。

// dd-mm-yyyy
#define YEAR_MIN 1919
#define YEAR_MAX 2019
int dateCheck(void) {
  int day, month, year;
  char inputValue[20] = {0};
  printf("Enter date : ");
  fgets(inputValue, sizeof inputValue, stdin);

  if (scan_int(&year, &inputValue[3 + 3], YEAR_MIN, YEAR_MAX, 4, '\0')
      && scan_int(&month, &inputValue[3], 1, 12, 2, '-')
      && scan_int(&day, inputValue, 1, eom(year, month), 2, '-')) {
    printf("Valid. %02d-%02d-%04d\n", day, month, year);
    return 1;
  }
  printf("Invalid.\n");
  return 0;
}

妙招:代码day在获取有效的year, month.


推荐阅读