我正在做以下转换和检查日期,但是,我不确定为什么以下日期保持验证为真.
%d不会只检查[01,31]前导零吗?有没有更好,更准确的方法呢?
#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; }
解决方法
它返回非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,buffer); // prints 29-01-20 return 0; }
请注意,我已经为strptime()模式添加了一个尾随空格 – 这允许接受输入中的尾随空格.如果您不想允许,请使用原始模式.