我有一个任务,我必须通过C与SQL数据库进行通信,尽管我能够做到这一点,但如果不使用特定的字符串格式,则数据不会放入数据库中。
简而言之,我正在扫描一个字符串(出生日期),数据库期望该格式为“ years-months-days”格式,但是我无法弄清楚如何检查该字符串是否确实存在以这种格式。因此,例如,它预期为“ 1995-11-23”。
非常欢迎任何帮助。谢谢!
printf("What is the date of brith you would like to input?\n");
fgets(birth_date, 255, stdin);
答案 0 :(得分:5)
您可以使用strptime
来解析时间,然后combination of mktime
and strftime
to validate的日期实际上是有效的。
考虑以下代码:
#define _XOPEN_SOURCE
#include <time.h>
#include <stdio.h>
#include <string.h>
int main(void)
{
char birth_date[12], *p, *state="invalid";
struct tm tv = {0};
fprintf(stdout, "Enter date: yyyy-mm-dd: ");
if (fgets(birth_date, sizeof(birth_date), stdin) != NULL)
{
if ((p = strchr(birth_date, '\n')) != NULL)
*p = 0; /* Remove the newline left by fgets */
if ((p = strptime(birth_date, "%Y-%m-%d", &tv)) != NULL)
{
char b[12];
mktime(&tv);
if ((strftime(b, sizeof(b), "%Y-%m-%d", &tv) > 0) &&
strcmp(b, birth_date) == 0)
{
state = "valid";
}
}
fprintf(stdout, "Date %s is %s\n", birth_date, state);
}
return 0;
}
收益:
Enter date: yyyy-mm-dd: 2019-05-11 Date 2019-05-11 is valid Enter date: yyyy-mm-dd: foo Date foo is invalid Enter date: yyyy-mm-dd: 2018-02-29 Date 2018-02-29 is invalid Enter date: yyyy-mm-dd: 2016-02-29 Date 2016-02-29 is valid
将birth_date
与strftime
的结果进行比较还具有副作用,即不允许birth_date
中的未转换为日期的多余字符。例如,如果用户输入2019-05-11
(末尾有空格),则该日期将被视为无效。