我有一个任务,我必须通过 C 与 SQL 数据库进行通信,虽然我能够做到这一点,但如果不使用特定的字符串格式,数据就不会被放入数据库。
简而言之,我正在扫描一个字符串(出生日期),数据库需要该特定格式的格式“年-月-日”,但我无法弄清楚如何检查该字符串是否确实是以那种格式。因此,例如,它需要“1995-11-23”。
非常欢迎任何帮助。谢谢!
printf("What is the date of brith you would like to input?\n");
fgets(birth_date, 255, stdin);
可以使用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
(末尾有一个空格),此日期将被拒绝为无效。