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

标签 c string format

<分区>

我有一个任务,我必须通过 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_datestrftime 的结果进行比较还有一个副作用,即不允许 birth_date 中未转换为日期的额外字符。例如,如果用户输入 2019-05-11(末尾有一个空格),此日期将被拒绝为无效。

关于c - 如何在 C 中扫描特定的字符串格式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56086199/

相关文章:

c++ - 重新定义断言是邪恶的吗?

javascript - 检查字符串是否包含其他字符串的集合

c - 创建 split 函数时出错

c++ - 为什么要在函数中使用 c_str()

php - 如何在 PHP 中截断 html 文本并仍然保持格式

android - 如何使用 NDK 为 Android 编译现有的 C 程序?

c - 段错误解析json-c

c - `int (*B)[COLSIZE];` 和 `int *C[ROWSIZE];` 之间的区别?

go - "%!s"- 当格式字符串来自参数时 fmt.Printf 中出现类似错误(go 语言)

powershell - 将数组的输出格式化为字符串