如何在C中正确检查strptime的有效日期

时间:2012-05-30 03:18:39

标签: c validation date strftime strptime

我正在执行以下操作来转换和检查日期,但是,我不确定为什么以下日期保持验证为真。

%d不会只检查[01,31] + leading zeros吗?有没有更好更准确的方法呢?

#include <time.h>
#include <stdio.h>
#include <stdlib.h>

int main () {
    struct tm tm; 

    char buffer [80];
    char *str = "29/Jan/2012";
    if (strptime (str, "%Y/%b/%d", &tm) == NULL)
        exit(EXIT_FAILURE);
    if (strftime (buffer,80,"%Y-%m-%d",&tm) == 0)
        exit(EXIT_FAILURE);

    printf("%s\n", buffer); // prints 29-01-20

    return 0;
}

1 个答案:

答案 0 :(得分:6)

它返回非NULL,因为初始子串29/Jan/20与模式匹配(特别是20匹配模式中的最终%d

如果strptime()返回非 - NULL,则返回指向输入字符串中与模式匹配的部分之后的下一个字符的指针。因此,在这种情况下,它将返回指向日期字符串中'1'字符的指针。

如果要确保输入字符串中没有遗留任何内容,则需要检查返回值是否指向输入字符串末尾的终止空值:

int main ()
{
    struct tm tm;

    char buffer [80];
    char *str = "29/Jan/2012";
    char *end = strptime(str, "%Y/%b/%d ", &tm);
    if (end == NULL || *end != '\0')
        exit(EXIT_FAILURE);
    if (strftime (buffer,80,"%Y-%m-%d",&tm) == 0)
        exit(EXIT_FAILURE);

    printf("%s\n", buffer); // prints 29-01-20

    return 0;
}

请注意,我在strptime()模式中添加了一个尾随空格 - 这允许接受输入中的尾随空格。如果您不想允许,请使用原始模式。