fprintf和difftime疯狂

时间:2011-12-10 12:06:25

标签: c printf time-t

搜索此答案但找不到任何内容。我能找到的最接近的是 difftime returning 0 when there is clearly a difference这有一个很好的解释,与参数如何被推入堆栈以及格式所期望的有关,但我认为我的问题不同:

我尽可能简单地做了一个例子。假设我在C中有以下代码:

time_t starttime = time(NULL)
somefunction();
time_t newtime = time(NULL)

fprintf(stderr, "starttime %f and difftime %f\n", starttime, difftime(newtime, starttime));
fprintf(stderr, "difftime %f and starttime %f\n", difftime(newtime, starttime), starttime);
return 0;

某些功能是一些运行1或2秒的功能。我得到的输出是:

starttime 2.000000 and difftime 0.000000
difftime 2.000000 and starttime 0.000000

我甚至不知道从哪里开始我的问题。为什么在我交换订单时,输出值仍然相同?此外,为什么其中一个值为0?这是相同的我是否使用%f,%d,%lu,%llu等。是否有堆栈参数解释?什么是fprintf真正在内部做什么?

谢谢。我已经浪费了太多的时间来尝试调试这个,我真的很感激你的帮助!

2 个答案:

答案 0 :(得分:2)

"%f"说明符不适合您平台上的time_t。据我所知,time_t类型可以是整数或实数。

例如the POSIX standard只是说:

  

time_tclock_t应为整数或实数浮点类型。

试试这个:

/* Flawed bad and wrong. */
printf("%f\n", (double)starttime);

我已经看到了将其投放到uintmax_tunsigned long long等的建议。显然,真正的答案是here

  

没有统一的方法来printf()time_t,period。你不是   应该这样做 - 你甚至不需要知道什么是time_t   内部。建议的替代方案包括ctime()和strftime()。   请使用这些来保持代码的便携性。

答案 1 :(得分:1)

starttimetime_t,但是您要打印%f,预计double。显然,在您的平台上,time_t是一种整数类型。

可能,您的平台对变量参数列表函数(如fprintf())的调用约定将浮点参数传递到与整数参数不同的位置。

difftime()函数可能返回2.0,它在第一个浮点参数位置传递,这就是为什么第一个%f在两种情况下都打印出2.0。第二个浮点参数位置似乎包含零,因此第二个%f在两种情况下都打印为零。 time_t参数被放置在fprintf()代码未检查的其他位置。