如何使用strptime()将char类型转换为time结构并解决difftime报错
问题解决思路
错误根源
你遇到的编译警告和转换问题来自三处错误:
difftime要求传入两个time_t类型的参数,你错误传入了char数组buffer和函数指针localtime,类型完全不匹配strptime的格式字符串和你实际存储的lastlogged格式YYYY:MM:DD:HH:MM:SS不匹配,用%x%X无法正确解析出时间字段- 缺少
mktime调用:strptime仅能把字符串解析填充到struct tm结构体中,需要手动调用mktime把struct tm转换为time_t类型才能传给difftime计算差值
修正步骤
- 调整
strptime的格式字符串为%Y:%m:%d:%H:%M:%S,和你存储的时间格式完全对应 - 调用
mktime把填充完成的struct tm res转换为time_t类型的上次登录时间 - 调用
difftime时传入当前时间的time_t值(你之前已经存在变量t中)和转换得到的上次登录time_t值,得到的差值就是两次时间间隔的秒数 - 注意使用
struct tm前先清零初始化,避免脏数据导致转换异常
修正后的代码片段
// 前面的变量定义保持不变 t = time (NULL); timeptr = localtime (&t); printf("_____ Log-in Statistics _____\n"); for(int i = 0; i < STDAMNT; i++) { strcpy(buffer, z->students[i].lastlogged); // 先清零tm结构体,避免脏数据 memset(&res, 0, sizeof(struct tm)); // 用和存储格式匹配的格式串解析 strptime(buffer, "%Y:%m:%d:%H:%M:%S", &res); // 将tm结构转为time_t time_t last_login_time = mktime(&res); // 第一个参数是较晚的时间,第二个是较早的时间,得到差值为秒数 difference = difftime(t, last_login_time); // 后续处理差值的逻辑 }
如果需要计算的是上次登录到当前的总时长,直接对difference的秒数做时分秒转换即可。
内容的提问来源于stack exchange,提问作者user10534537
相关产品推荐
相关产品推荐

