strptime处理固定格式string中的空格

有没有办法让strptime()来处理固定格式的时间string?

我需要parsing一个总是固定宽度格式的时间string:“ yymmdd HHMMSS ”,但是有些前导零有时会出现,有时不会。

阅读strptime的man(3p)页面,我注意到对于所有的转换说明符%y, %m, %d, %H, %M, %S ,注释:“前导零应被允许但不得需要。”。 因此,我尝试格式说明符%y%m%d %H%M%S ,天真希望strptime会认识到两个子string%y%m%d%H%M%S中的空格相当于(缺less)领先零。

这似乎适用于说明符%m ,但不适用于%M (好吧,除非第二部分小于10),如下面的代码段

 #include <stdio.h> #include <time.h> int main() { struct tm buff; const char ts[]="17 310 22 312"; char st[14]; strptime(ts,"%y%m%d %H%M%S", &buff); strftime(st,14,"%y%m%d %H%M%S",&buff); printf("%s\n",ts); printf("%s\n",st); return 0; } 

编译并在我的机器输出上运行

 17 310 22 312 170310 223102 

任何有关如何解决这个问题的见解,我将不胜感激,或者我需要求助于手动切断string2字符在这个时候使用atoi转换为整数来填充我的struct tm实例?

这将是最好的获取生成的数据与固定的奇怪格式的代码。

假设今天早上不能完成,那么也许你应该规范(复制)这样的数据:

 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> static inline void canonicalize(char *str, int begin, int end) { for (int i = begin; i <= end; i++) { if (str[i] == ' ') str[i] = '0'; } } int main(void) { struct tm buff; const char ts[] = "17 310 22 312"; char st[32]; char *raw = strdup(ts); printf("[%s] => ", raw); canonicalize(raw, 0, 5); canonicalize(raw, 7, 12); printf("[%s] => ", raw); strptime(raw, "%y%m%d %H%M%S", &buff); strftime(st, sizeof(st), "%y%m%d %H%M%S", &buff); printf("[%s] => ", st); strftime(st, sizeof(st), "%Y-%m-%d %H:%M:%S", &buff); printf("[%s]\n", st); free(raw); return 0; } 

canonicalize()函数将字符串的给定范围内的零替换为空值。 很明显,如果你指定的出发点和结束点超出范围,它将会走出界限。 我保留了const ,并用strdup()复制了一个副本。 如果您可以将字符串视为可变数据,则不需要制作(或免费)副本。

该代码的输出是:

 [17 310 22 312] => [170310 220312] => [170310 220312] => [2017-03-10 22:03:12]