ctime - 了解对 ctime() 的连续调用

标签 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

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

问:第一种方法不是连续调用吗?

感谢您的回复。

最佳答案

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

第二种方法如您所料:调用 ctime,填充缓冲区,然后打印结果;然后重复这个过程。所以你打印了两个不同的时间。

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

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

关于ctime - 了解对 ctime() 的连续调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8859084/

相关文章:

未找到 C++、MingW、ctime、nanosleep()?

C++ - 'localtime' 此函数或变量可能不安全

c++ - CPU 上的时间比实际花费的要快

c++ - 分析时间时c++中的运行时错误

c++11 以微秒精度获取当前时间

c++ - 隐式转换 double 到 unsigned long 溢出 c++

c++ - 自纪元以来的时间为-1

c++ - 循环 rand(),在下一个 rand() 上不要使用前一个?

c - 向 tm 结构添加一些间隔

c++ - 调用 'localtime_s' 时日历功能崩溃