我遇到了一个问题,我希望用户输入日期。用户输入的日期可以是任何格式,例如。 dd-mm-yy
,dd-mm-yyyy
,dd-month-yy
。我只能想到两种方法。
1.使用结构。但是没有指定日期格式。
2.使用sscanf()
和sprintf()
函数复制为字符串,然后使用sscanf()函数获取invidual值。
请纠正我。
答案 0 :(得分:1)
嗯,最简单的[也许是最安全的]实现此目的的方法是
fgets()
.
,-
,/
作为分隔符来标记字符串strtok_r()
,并strlen()
可能dd
区分mm
},yyyy
和{{1}}。 strtol()
ans将字符串转换为inegers。不用说,不要忘记随后验证数据。
答案 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)
我将成为这里的恶魔倡导者并建议编写一个简单的解析器。
让我们看一下这些格式,看看我们将要接受的内容:
以下是我刚刚打起来作为一个例子
#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美分。