C语言中mktime与ctime处理time_in输出异常,请求排查代码问题
问题排查:time_in输出异常
无法正确输出time_in,请求帮忙排查代码错误,感谢!
输入格式说明
输入示例为55 17:30 11-06-2023 07:15 15-07-2023,第一个数字为租车价格(无实际作用),后续为租赁时间和归还时间,格式为HH:MM DD-MM-YYYY。需使用mktime将两个时间转为long int格式输出,使用ctime转为标准时间格式(如Sat Jul 15 07:15:01 2023)输出。
我的代码
#include <stdio.h> #include <time.h> int main(){ int price; scanf("%d", &price); struct tm input_time; struct tm output_time; time_t time_in, time_out; scanf("%d:%d %d-%d-%d", &input_time.tm_hour, &input_time.tm_min, &input_time.tm_mday, &input_time.tm_mon, &input_time.tm_year); scanf("%d:%d %d-%d-%d", &output_time.tm_hour, &output_time.tm_min, &output_time.tm_mday, &output_time.tm_mon, &output_time.tm_year); input_time.tm_mon -= 1; output_time.tm_mon -= 1; input_time.tm_year -= 1900; output_time.tm_year -= 1900; // printing out every component to check if i failed to input them printf("%d\n", price); printf("%ld:", input_time.tm_hour ); printf("%ld ", input_time.tm_min ); printf("%ld-", input_time.tm_mday ); printf("%ld-", input_time.tm_mon ); printf("%ld\n", input_time.tm_year ); printf("%ld:", output_time.tm_hour ); printf("%ld ", output_time.tm_min ); printf("%ld-", output_time.tm_mday ); printf("%ld-", output_time.tm_mon ); printf("%ld\n", output_time.tm_year ); //using mktime time_in = mktime(&input_time); time_out = mktime(&output_time); // print out the time in seconds form printf("%ld\n", time_in); printf("%ld\n", time_out); // print out the time in the 'Sat Jul 15 07:15:01 2023' form printf(ctime(&time_in)); printf(ctime(&time_out)); }
运行情况
归还时间输出正常,但租赁时间(time_in)每次运行结果都混乱,两次运行输出如下:
第一次运行:
550000 17:30 11-5-123 7:15 15-6-123 1592440040 1689380101 Thu Jun 18 07:27:20 2020 Sat Jul 15 07:15:01 2023
第二次运行:
550000 17:30 11-5-123 7:15 15-6-123 -2085243656 1689380101 Mon Jan 09 19:07:20 2040 Sat Jul 15 07:15:01 2023
问题原因及解决方法
- 核心问题:声明的
struct tm局部变量input_time和output_time未初始化,内存中残留随机垃圾值。mktime需要依赖结构体的所有字段(包括tm_sec、tm_wday、tm_yday、tm_isdst)计算时间戳,未初始化的字段会导致计算结果异常,output_time偶尔正常只是巧合。 - 解决步骤:
- 初始化
struct tm变量,将所有字段置0:
或者使用struct tm input_time = {0}; struct tm output_time = {0};memset清空结构体:memset(&input_time, 0, sizeof(struct tm)); memset(&output_time, 0, sizeof(struct tm)); - 设置
tm_isdst为-1,让mktime自动检测夏令时(推荐做法):input_time.tm_isdst = -1; output_time.tm_isdst = -1;
- 初始化
- 额外修正:打印
struct tm字段时,tm_hour、tm_min等是int类型,应使用%d格式符,避免类型不匹配的输出问题。
内容的提问来源于stack exchange,提问作者NgoMinh
相关产品推荐
相关产品推荐

