使用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
相关产品推荐
相关产品推荐

