验证嵌入式应用程序的时间戳字符串

时间:2018-11-14 18:46:33

标签: c algorithm embedded

我需要为我的一个嵌入式应用程序验证时间戳字符串。该SDK不提供regex.h,因此我需要提出另一种解决方案。

我一直在搜索,并在github上找到了一些轻量级的正则表达式替代品,但是我想在将其集成到构建中之前先看看是否有更好/更简单的替代品。

有人建议如何在C语言中实现这样的功能?该字符串的格式为: YYYY-MM-DD HH:MM:SS 。我也控制这种格式,因此,如果有更好的格式,我可以采用。

1 个答案:

答案 0 :(得分:1)

通过“模式匹配”,我假设您想知道这样的字符串是否有效。

#include <stdbool.h>
#include <string.h>

bool is_leap_year(int year)
{
    return (year & 3) == 0 && ((year % 25) != 0 || (year & 15) == 0); // *)
}

bool in_range(int min, int value, int max)
{
    return min <= value && value <= max;
}

bool is_valid_timestamp(char const *datetime)
{
    int const days_per_month[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
    int y, m, d, h, min, sec;
    char seperators[5];

    return strlen(datetime) == 19
        && sscanf(datetime, "%d%c%d%c%d%c%d%c%d%c%d", &y, &seperators[0],
                  &m, &seperators[1], &d, &seperators[2], &h, &seperators[3], 
                  &min, &seperators[4], &sec) == 11
        && in_range(0, y, 9999) && in_range(1, m, 12)
        && in_range(1, d, m == 2 && is_leap_year(y) ? 29 : days_per_month[m - 1])
        && in_range(0, h, 23) && in_range(0, min, 59) && in_range(0, sec, 59)
        && strncmp(seperators, "-- ::", 5) == 0;
}

in_range(0, y, 9999) ...或任何您认为“有效”的年份。

*)https://stackoverflow.com/a/11595914/3975177