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

使用struct tm成功打印生日,调用strftime()遇指针参数适配问题求助

解决strftime()要求指针参数的问题

别担心,这个问题其实挺常见的——strftime()函数的第四个参数确实要求传入指向struct tm的指针,而不是结构体变量本身。你已经正确手动初始化了生日的struct tm数据,只需要简单调整参数传递方式就能搞定。

修正后的完整代码示例

#include <stdio.h>
#include <time.h>

int main(){
    struct tm str_bday;
    char buffer[64]; // 扩大缓冲区,避免长格式字符串溢出原15字节的限制
    
    // 手动填充生日数据,补全未初始化字段防止未定义行为
    str_bday.tm_year = 1994 - 1900 ; // 年份需减去1900
    str_bday.tm_mon = 7 - 1; // 月份从0开始计数(0=1月)
    str_bday.tm_mday = 30;
    str_bday.tm_hour = 12;
    str_bday.tm_min = 53;
    str_bday.tm_sec = 0; // 初始化秒数
    str_bday.tm_wday = 0; // 星期字段(可选,但建议初始化)
    str_bday.tm_yday = 0; // 年中天数(可选)
    str_bday.tm_isdst = -1; // 让系统自动判断夏令时状态
    
    // 关键:传入结构体的地址&str_bday给strftime
    // 示例1:标准数字格式
    strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", &str_bday);
    printf("标准格式生日:%s\n", buffer);
    
    // 示例2:带星期和月份名称的可读性格式
    strftime(buffer, sizeof(buffer), "%A, %B %d, %Y %I:%M %p", &str_bday);
    printf("长格式生日:%s\n", buffer);
    
    return 0;
}

核心要点说明

  • 指针传递逻辑:strftime()的第四个参数类型是const struct tm*,所以必须用&str_bday获取结构体变量的内存地址传入,不能直接传结构体本身。
  • 缓冲区大小调整:原代码里的buffer[15]容量太小,存储带星期、月份名称的长格式会溢出,建议扩大到64字节左右更稳妥。
  • 结构体完整性:手动填充struct tm时,最好把所有未赋值的字段都初始化(比如tm_sec、tm_isdst),否则可能触发未定义行为,比如输出乱码或程序崩溃。其中tm_isdst设为-1可以让系统自动适配对应时间的夏令时规则。

内容的提问来源于stack exchange,提问作者Duc Nguyen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:22:18