从用户输入日期数据类型

时间:2014-11-07 06:14:39

标签: c date input

我遇到了一个问题,我希望用户输入日期。用户输入的日期可以是任何格式,例如。 dd-mm-yydd-mm-yyyydd-month-yy。我只能想到两种方法。

1.使用结构。但是没有指定日期格式。

2.使用sscanf()sprintf()函数复制为字符串,然后使用sscanf()函数获取invidual值。

请纠正我。

3 个答案:

答案 0 :(得分:1)

嗯,最简单的[也许是最安全的]实现此目的的方法是

  1. 使用fgets()
  2. 将输入作为字符串
  3. 使用.-/作为分隔符来标记字符串strtok_r(),并strlen()可能dd区分mm },yyyy和{{1}}。
  4. 使用strtol() ans将字符串转换为inegers。
  5. 不用说,不要忘记随后验证数据。

答案 1 :(得分:0)

使用如下所示的strtok(),您可以使用问题中提到的任何格式获取输入日期。

 int main()
    {
       char *p; 
       char a[20];
       printf("ENter date:\n");
       scanf("%s",a);

       p = strtok(a,"-");
       while( p  != NULL)
       {   
          printf("%s ",p);/* I am printing here you can do what even you want to */
          p = strtok(NULL,"-");
       }   
    }

答案 2 :(得分:0)

我将成为这里的恶魔倡导者并建议编写一个简单的解析器。

让我们看一下这些格式,看看我们将要接受的内容:

  • 一天(01至31)
  • 一个月(01至12或' 1月'至' 12月和#34;)
  • 一年(70-99和00-16或1970年至2016年)

以下是我刚刚打起来作为一个例子

#include <ctype.h>   // isalpha, isdigit
#include <string.h>  // strncmp

struct DATE {
    int day, month, year;
};

// return 1 on success, else 0 on failure
int readdate(DATE *date, char *text) {
    int toklen = 0;
    char *tokval;
    if (isdigit(*text)) {      // expect a number for the day
        date->day = *text++ - '0';
        if (isdigit(*text))    // accept another number
            date->day = date->day * 10 + *text++ - '0';
        if (date->day < 1 || date->day > 31)
            return 0;
    } else return 0;
    if (*text == '-')          // expect a hyphen
        text++;
    else
        return 0;
    if (isdigit(*text)) {      // accept a number for the month...
        date->month = *text++ - '0';
        if (isdigit(*text))    // accept another number
            date->month = date->month * 10 + *text++ - '0';
        if (date->month == 0 || date->month > 12)
            return 0;
    } else if (isalpha(*text)) {
        tokval = text;         // accept a word
        do {
            toklen++;
            text++:
        } while (isalpha(*text));
        /* expect that the word is a name of a month */
        if (!strncmp("january", tokval, toklen))
            date->month = 1;
        else if (!strncmp("february", tokval, toklen))
            date->month = 2;
        else if (!strncmp("march", tokval, toklen))
            date->month = 3;
        else if (!strncmp("april", tokval, toklen))
            date->month = 4;
        else if (!strncmp("may", tokval, toklen))
            date->month = 5;
        else if (!strncmp("june", tokval, toklen))
            date->month = 6;
        else if (!strncmp("july", tokval, toklen))
            date->month = 7;
        else if (!strcmp("august", tokval, toklen))
            date->month = 8;
        else if (!strcmp("september", tokval, toklen))
            date->month = 9;
        else if (!strcmp("october", tokval, toklen))
            date->month = 10;
        else if (!strcmp("november", tokval, toklen))
            date->month = 11;
        else if (!strcmp("december", tokval, toklen))
            date->month = 12;
        else
            return 0;
    } else return 0;
    if (*text == '-')        // expect a hyphen
        text++;
    else
        return 0;
    if (isdigit(*text)) {           // expect a number
        date->year = *text++ - '0';
        if (isdigit(*text)) {       // expect another number
            date->year = date->year * 10 + *text++ - '0';
            if (isdigit(*text)) {   // accept another number
                date->year = date->year * 10 + *text++ - '0';
                if (isdigit(*text)) // expect another number
                    date->year = date->year * 10 + *text++ - '0';
                else
                    return 0;
            }
        } else return 0;
        /* ensure the year fits a valid range */
        if (date->year >= 70 && date->year <= 99)
            date->year += 1900;
        else if (date->year < 70)
            date->year += 2000;
        if (date->year < 1970 || date->year > 2070)
            return 0;
    } else return 0;
/*
 * you can do some optional checking on the date here to verify if the
 * day of the month is valid here
 */
    return 1;
}

当您开始处理多种字符串格式时,从长远来看,它通常更容易和更易于管理,只需编写一个简单的解析器。但那只是我的2美分。