Проверка строки метки времени для встроенного приложения - PullRequest
0 голосов
/ 14 ноября 2018

Мне нужно проверить строку метки времени для одного из моих встроенных приложений. SDK не предоставляет regex.h, поэтому мне нужно найти другое решение.

Я гуглил и нашел несколько легких альтернатив регулярных выражений на github, но я хотел посмотреть, есть ли лучшая / более простая альтернатива, прежде чем я начну интегрировать это в сборку.

Любое предложение, как сделать такую ​​функцию в C? Строка будет иметь формат: ГГГГ-ММ-ДД ЧЧ: ММ: СС . Я тоже контролирую этот формат, поэтому, если другой лучше, я могу принять его.

1 Ответ

0 голосов
/ 14 ноября 2018

Под «сопоставлением с образцом» я предполагаю, что вы хотите знать, допустима ли такая строка.

#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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...