如何正确使用ctime()打印不同的时间戳
我期待下面的代码应该打印不同的时间戳t1和t2,但结果显示t1和t2是相同的。我在哪里犯了错误?如何正确使用ctime()打印不同的时间戳
结果:
time now Thu Apr 28 20:37:03 2016 time now Thu Apr 28 20:37:03 2016
time later Thu Apr 28 20:37:03 2016
回答:
的回答你的问题可以在the manual page for the ctime() function发现:
返回值指向一个静态分配的字符串可能 的后续调用覆盖到任何日期和时间 函数。
ctime()返回一个指向它使用的内部缓冲区的指针。每次它叫时,它返回一个指向同一缓冲区:
cout << "time now " << ctime(&t1) << endl << " time later " << ctime(&t2) <<endl;
对于此行的代码,你的编译器生成的代码调用ctime()
两次,然后执行<<
操作。但在第二次调用ctime()
时,它第二次覆盖了缓冲区,所以当<<
运算符格式化输出时,因为第一次调用ctime()
的结果是相同的指针,并且它指向的缓冲区已被覆盖通过第二次电话ctime()
,您可以同时打印两次。
谢谢发布Minimal, Complete, and Verifiable example。
回答:
什么是ctime
实际返回?从cppreference:
指向包含日期和时间文本表示的静态空终止字符串的指针。 字符串可以在
std::asctime
和std::ctime
之间共享,并且可以在对这些函数中的任何函数的每次调用时被覆盖。
它可能工作的是你的编译器,后来ctime()
被首先调用,那么更新ctime()
,那么这两个operator<<()
小号得到评估 - 这发出相同char*
。由于未指定的顺序,您的代码具有未定义的行为。在一些编译器上,它可以像你期望的那样工作!在你的情况下,情况并非如此。
如果分离出两个电话:
cout << "time now " << ctime(&t1) << endl; cout << " time later " << ctime(&t2) <<endl;
你肯定会和不断地看到不同的值。
回答:
报价从N1570 7.27.3时间转换功能:
除strftime函数,这些函数返回一个指向两个 类型的静态对象中的一个:一个破碎下降时间结构或字符数组。执行 任何返回指向其中一个对象类型的函数的任何函数都可能会覆盖以前调用任何对象时返回的值所指向的同一类型的任何对象中的信息,并且这些函数不是必需的以避免数据与 彼此竞争。
这表明,通过取之于ctime()
返回指向的内容可以通过ctime()
另一个呼叫被覆盖,所以你必须复制的结果在一个表达中,没有序列点使用的结果。
试试这个:
#include<iostream> #include<ctime>
#include<string>
using namespace std;
int main()
{
time_t t1 = time(NULL);
cout << "time now " << ctime(&t1) << endl;
time_t t2 = t1 + 10000.0;
string t1s = ctime(&t1);
string t2s = ctime(&t2);
cout << "time now " << t1s << endl << " time later " << t2s <<endl;
}
以上是 如何正确使用ctime()打印不同的时间戳 的全部内容, 来源链接: utcz.com/qa/257180.html