use*_*718 7 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;
}
Run Code Online (Sandbox Code Playgroud)
它返回非NULL,因为初始子字符串29/Jan/20与模式匹配(特别是20匹配%d模式中的final ).
如果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;
}
Run Code Online (Sandbox Code Playgroud)
请注意,我为strptime()模式添加了一个尾随空格- 这允许接受输入中的尾随空格.如果您不想允许,请使用原始模式.
| 归档时间: |
|
| 查看次数: |
2611 次 |
| 最近记录: |