Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 正在验证嵌入式应用程序的时间戳字符串_C_Algorithm_Embedded - Fatal编程技术网

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

C 正在验证嵌入式应用程序的时间戳字符串,c,algorithm,embedded,C,Algorithm,Embedded,我需要为我的一个嵌入式应用程序验证时间戳字符串。SDK不提供regex.h,所以我需要想出另一个解决方案 我一直在谷歌上搜索,在github上发现了一些轻量级的正则表达式替代品,但我想在开始将其集成到构建中之前看看是否有更好/更简单的替代品 有没有关于如何在C中创建这样一个函数的建议?字符串的格式为:YYYY-MM-DD HH:MM:SS。我也控制这种格式,因此如果另一种格式更好,我可以采用这种格式。通过“模式匹配”,我假设您想知道这样的字符串是否有效 #include <stdbool.

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

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

有没有关于如何在C中创建这样一个函数的建议?字符串的格式为:YYYY-MM-DD HH:MM:SS。我也控制这种格式,因此如果另一种格式更好,我可以采用这种格式。

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

#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;
}
#包括
#包括
布尔是闰年(整数年)
{
回报率(第三年)==0&((第25年)!=0 | |(第十五年)==0);/*)
}
布尔值在_范围内(最小整数、值、最大整数)
{

返回min如果您知道字符串为
YYYY-MM-DD HH:MM:SS
格式,为什么需要对其进行模式匹配?可能您的意思是提取
Y
M
D
H
M
S
值?您是否尝试过
strtime
?您是对的。我没有表达问题,它应该有S帮助验证而不是模式匹配。我现在已经更改了标题。这是一个非常狭窄和简单的要求;除非您要验证其他不同格式的字符串,否则通用匹配/验证库将添加大量代码。只需读取分隔标记并验证它们-您可能会编写更多的代码,但该代码将比您可能导入的任何通用库代码都要小。我必须说,我印象深刻。工作起来很有魅力!非常感谢您的时间。为什么
年份%25
而不是
年份%100
?它们最终的工作方式相同,但
%100
使用了公式I的实际值s基于(不是可被100整除的年份,但可被400整除的年份除外)。只是希望使用尽可能最小的数字,或者我缺少效率增益?我当然可以理解为什么您会避免使用
&15
而不是
%400
进行另一次除法。请查看我答案中的链接:“第100年测试使用的是模25而不是模100。我们可以这样做,因为100个因子取2 x 2 x 5 x 5。因为第4年测试已经检查了因子4,我们可以从100中删除该因子,剩下25。这种优化可能对几乎每个CPU实现都无关紧要(因为100和25都适合8位)。”