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