You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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偶尔正常只是巧合。
  • 解决步骤:
    1. 初始化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));
      
    2. 设置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 15:16:09