【问题标题】:How to properly check strptime for valid dates in C如何在 C 中正确检查 strptime 的有效日期
【发布时间】:2012-06-04 07:00:10
【问题描述】:

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

%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;
}

【问题讨论】:

  • %d 只能读取 1 或 2 位数字,因此它带有 20。当然,它与sscanf() 中的%d 不同。

标签: c validation date strftime strptime


【解决方案1】:

它返回非 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() 模式中添加了一个尾随空格 - 这允许接受输入中的尾随空格。如果您不想这样做,请使用您的原始模式。

【讨论】:

  • 非常感谢。还有一个问题,这基本上适用于任何格式说明符吗?还是只有%d
  • 任何数字格式说明符都会适当地限制其输入。因此,您可以期望%y 最多读取两位数。
猜你喜欢
  • 1970-01-01
  • 2012-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-16
  • 1970-01-01
  • 2010-10-25
相关资源
最近更新 更多