【问题标题】:C program to print up-time in hours,minutes and seconds.C 程序以小时、分钟和秒为单位打印正常运行时间。
【发布时间】:2012-03-15 03:23:34
【问题描述】:

我做了这个程序以小时、分钟和秒为单位打印时间

#include<stdio.h>

int main()

{

float a, b,x,mina,minb,hrsa,hrsb;
float seca,secb;
FILE *fp = fopen("/proc/uptime", "r");
fscanf(fp, "%f %f", &a, &b);

seca=(a)%60;
mina=seca/60;
hrsa=mina/60;

secb=(b)%60;
minb=secb/60;
hrsb=minb/60;

printf("Uptime=%f hrs %f min %f sec",hrsa,mina,seca);

printf("Idealtime =%f hrs %f min %f sec",hrsb,minb,secb);

return 0;
}

我在第 12 行和第 16 行收到错误“二进制操作数无效”。

【问题讨论】:

    标签: c linux


    【解决方案1】:

    你不能在花车上做 mod (%)。试试((long)a)%60;甚至(long long),不过1

    另外,您需要对分钟进行另一次 mod 操作,否则 3601 秒将变为“1 小时 60 分 1 秒”,而不是“1 小时 0 分 1 秒”。

    【讨论】:

    • 我没有看到使用 long long 有任何明显的好处,需要解释一下吗? (我知道浮点数的舍入和 x86 表示,但在这种情况下,它对我来说没有意义)。
    • 我只是在想 FLOAT_MAX 是 1E38 而 LONG_MAX 是 4E9 的事实。我没有计算出 4e9 秒是 136 年,因此 long 应该足够了。
    • 不过,您可以调用 fmodf 或(在 C99 中)remainderf,这将返回浮点余数
    • ((long)a)) 确实有效。我从未在 C 中使用过它。你能解释一下它是如何工作的吗?
    • 这是一个类型转换。它实际上强制编译器在操作之前将a 转换为long。你可以把它想象成long temp = a; seca = temp%60;
    【解决方案2】:

    您不能取浮点数的模数(5.5/3 的余数是多少?没有意义)。

    顺便说一句,/proc/uptime 返回的值已经以秒为单位,所以 seca 应该是

    seca=(long)(a);
    

    【讨论】:

      【解决方案3】:

      abfloat,应该是int

      【讨论】:

        【解决方案4】:

        除非您必须手动执行此操作,否则请查看标准时间函数。

        人工时间.h

        对于您的代码(正如其他人指出的那样),您不能真正对浮点数进行整数除法和整数模运算(毫无意义)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-05-30
          • 2011-07-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多