C语言strptime()解析ISO 8601日期返回异常时分秒如何解决
问题根因
- 你定义的
struct tm bd_date是局部栈变量,未做初始化时内存中是随机垃圾值 strptime的标准行为是仅修改格式字符串匹配到的对应结构体字段,未匹配到的字段会保留原始值,不会自动置0。你使用的%Y-%m-%d格式仅会修改年、月、日三个字段,时分秒字段保留了初始垃圾值,因此输出异常大数。
修复方案
调用strptime之前先将整个struct tm结构体清零即可,有两种常用写法:
- 定义时直接初始化
struct tm bd_date = {0};
- 用memset清零(适合已定义的结构体)
#include <string.h> memset(&bd_date, 0, sizeof(struct tm));
修复后的完整示例代码:
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <string.h> int main() { char *s_date = malloc(255); if (s_date == NULL) return 1; scanf("%254s", s_date); // 限制输入长度避免缓冲区溢出 struct tm bd_date = {0}; // 建议判断strptime返回值确认解析成功 if (strptime(s_date, "%Y-%m-%d", &bd_date) == NULL) { printf("日期解析失败\n"); free(s_date); return 1; } // 可选:设置tm_isdst为-1让系统自动判断夏令时,避免后续mktime调用出错 bd_date.tm_isdst = -1; printf("%d-%d-%d %d:%d:%d\n", bd_date.tm_year + 1900, bd_date.tm_mon + 1, bd_date.tm_mday, bd_date.tm_hour, bd_date.tm_min, bd_date.tm_sec); free(s_date); return 0; }
额外说明
- 你贴出的示例代码中
strptime行末尾缺少分号,属于笔误,实际编译时需要补上 - 建议每次调用
strptime都判断返回值,避免输入格式不匹配导致的未知错误
内容的提问来源于stack exchange,提问作者VoteAnthony
相关产品推荐
相关产品推荐

