理解对ctime的连续调用()

时间:2012-01-14 00:35:21

标签: ctime

我有一个关于glibc ctime()如何工作的问题。

关注我的摘录:

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


int main (int argc,char** argv)
{
    int ret=EXIT_SUCCESS;

    time_t tm1;
    time_t tm2;


    tm1 = time(NULL);
    tm2 = tm1 + 60; // 60 seconds later


    puts("1st method-------");
    printf("tm1 = %stm2 = %s",ctime(&tm1),ctime(&tm2));


    puts("2nd method-------");
        printf("tm1 = %s",ctime(&tm1));
    printf("tm2 = %s",ctime(&tm2));

    return(ret);
}

我得到了:

1st method-------
tm1 = Sat Jan 14 01:13:28 2012
tm2 = Sat Jan 14 01:13:28 2012
2nd method-------
tm1 = Sat Jan 14 01:13:28 2012
tm2 = Sat Jan 14 01:14:28 2012

如您所见,在第一种方法中,两者都具有相同的值,这是不正确的。在第二种方法中,我得到了正确的值。 我知道ctime()将这些字符串放在静态缓冲区中,要覆盖它,我们需要连续调用ctime()。

问:我是不是在第一种方法中连续打电话了?

感谢您的回复。

1 个答案:

答案 0 :(得分:3)

您已提供解决问题所需的所有信息。

第二种方法可以正常工作:调用ctime,填充缓冲区,然后打印结果;然后重复这个过程。因此,您可以打印两个不同的时间。

对于第一种方法,顺序是不同的:调用ctime,然后再次调用它,然后才打印结果。每次调用ctime的结果都是相同的,至少就printf而言:静态缓冲区的地址。但是每个调用都改变了该缓冲区的内容,并且由于printf在两个ctime调用完成之前都没有查看缓冲区,因此它最终会打印两次更新的内容。

所以你在第一种方法中进行两次调用,只是第一次调用的结果在被打印之前被覆盖。