首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >fprintf和difftime疯狂

fprintf和difftime疯狂
EN

Stack Overflow用户
提问于 2011-12-10 20:06:25
回答 2查看 1.1K关注 0票数 0

已搜索此问题的答案,但什么也找不到。我能找到的最接近的是difftime returning 0 when there is clearly a difference,它有一个很好的解释,关于参数是如何推送到堆栈上的,以及格式需要什么,但我认为我的问题是不同的:

我已经做了一个尽可能简单的例子。假设我用C语言编写了以下代码:

代码语言:javascript
复制
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秒的函数。我得到的输出是:

代码语言:javascript
复制
starttime 2.000000 and difftime 0.000000
difftime 2.000000 and starttime 0.000000

我甚至不知道从哪里开始我的问题。为什么当我交换顺序时,输出值仍然是一样的?此外,为什么其中一个值是0?无论我使用%f,%d,%lu,%llu等,这都是一样的。有堆栈参数的解释吗?fprintf到底在内部做什么?

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-12-10 20:33:15

starttime是一个time_t,但是您要用%f打印它,它需要一个double。显然,在您的平台上,time_t是某种整数类型。

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

difftime()函数可能返回2.0,它是在第一个浮点参数位置传递的,这就是为什么第一个%f在两种情况下都会输出2.0的原因。第二个浮点参数位置似乎包含一个零,因此第二个%f在两种情况下都输出一个零。fprintf()代码根本不会检查time_t参数所在的位置。

票数 1
EN

Stack Overflow用户

发布于 2011-12-10 20:10:37

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

例如,the POSIX standard只说:

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

试试这个:

代码语言:javascript
复制
/* Flawed bad and wrong. */
printf("%f\n", (double)starttime);

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

没有统一的方法来打印time_t,句号。您不应该这样做-您甚至不需要在内部知道什么是time_t。建议的替代方法包括ctime()和strftime()。请使用这些来保持代码的可移植性。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8456382

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档