如何在C中扫描特定的字符串格式?

时间:2019-05-11 00:14:34

标签: c string format

我有一个任务,我必须通过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);

1 个答案:

答案 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_datestrftime的结果进行比较还具有副作用,即不允许birth_date中的未转换为日期的多余字符。例如,如果用户输入2019-05-11(末尾有空格),则该日期将被视为无效。