c - 使用 struct tm 打印特定日期和 strftime

标签 c pointers struct time-t

所以我需要专门使用 struct tm 来打印我的生日,我成功地做到了。但是,我还需要使用 strftime() 以不同格式打印它。 这就是我遇到问题的地方,因为 strftime() 只能识别指针参数。

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

int main(){

    struct tm str_bday;
    time_t time_bday;
    char buffer[15];

    str_bday.tm_year = 1994 - 1900 ;
    str_bday.tm_mon = 7 - 1;
    str_bday.tm_mday = 30;
    str_bday.tm_hour = 12;
    str_bday.tm_min = 53;
    time_bday = mktime(&str_bday);
    if(time_bday == (time_t)-1)
        fprintf(stdout,"error\n");
    else
        {
        fprintf(stdout,"My birthday in second is: %ld \n",time_bday);
        fprintf(stdout,"My birthday is: %s\n", ctime(&time_bday));//Wed July 22 12:53:00 1998
        strftime(buffer,15,"%d/%m/%Y",time_bday);
        fprintf(stdout,"My birthday in D/M/Y format is %s",buffer);
        }
    return 0;
}

错误是:

Error:  passing argument 4 of ‘strftime’ makes pointer from integer without a cast

    expected ‘const struct tm * restrict’ but argument is of type ‘time_t’

有人可以告诉我如何解决吗?

编辑:将 time_bday 更改为 &str_bday 有效!但现在程序每次运行时都会输出随机时间和日期。

编辑:在 strftime() 之后我没有使用 fprintf(),而是使用了 puts(buffer),它运行良好。另外,将 buffer[15] 更改为 buffer[30],因为我有小时、分钟和秒。

最佳答案

通过查看 strftime 的原型(prototype),您可以看到您应该传递一个 const struct tm* 作为最后一个参数:

size_t strftime(char *s, size_t maxsize, const char *format, const struct tm *timeptr);

在您的情况下,这将是 &str_bday 而不是 time_bday

struct tm 有几个您未初始化的字段,因此采用不确定的值,导致您看到的时间跳跃。在插入您的值之前,您可以使用 struct tm str_bday = {0} 将所有字段初始化为零。

关于c - 使用 struct tm 打印特定日期和 strftime,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49848704/

相关文章:

c - 栈内存读取

c - 返回数组 C 的指针时出现指针段错误

c - 使用 C 返回数组

C - 如何添加结构成员?

c - fork() 之前的 Printf 被打印两次

c - 使用 Ctrl+C 停止在前台启动的进程时出现段错误

c++ - 即使在向其添加新成员后,结构大小也保持不变

c# - 末尾带有 `this()` 的结构构造函数和另一个没有的结构构造函数有什么区别?

c++ - 通过 stdio 的 HTTP POST/GET

c++ - C++中的类查找结构数组