【问题标题】:Parsing user input using time_t使用 time_t 解析用户输入
【发布时间】:2011-07-24 10:31:58
【问题描述】:

我的想法是,如果用户输入t = 2.5,那么我在 2 个不同的变量中分别提取 2 和 0.5。但我做不到。

代码如下:

$ export LT_LEAK_START=1.5
$ echo $LT_LEAK_START
   1.5

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
 double d;
 time_t t;
 long nsec;

 d=strtod(getenv("LT_LEAK_START"), NULL);
 t=(time_t)d;

 nsec=d-(double)((time_t)d); // Extract fractional part as time_t always whole no.
 printf("d = %lf\n",d);
 printf("t = %u, nsec = %f\n",d,nsec);
}

输出是:

# ./a.out 
  d = 1.500000
  t = 0, nsec = 0.000000

【问题讨论】:

    标签: c time-t


    【解决方案1】:

    您的输出已损坏。您实际上在以下代码中两次写入了 d 的值:

    nsec=d-(double)((time_t)d); // Extract fractional part as time_t always whole no.
    printf("d = %lf\n",d);
    printf("t = %u, nsec = %f\n",d,nsec);
    

    如果你是这样写的:

    nsec=d-(double)((time_t)d); // Extract fractional part as time_t always whole no.
    printf("d = %lf\n",d);
    printf("t = %u, nsec = %f\n",t,nsec);
    

    然后你会得到输出:

    d = 1.500000
    t = 1, nsec = 0.000000
    

    现在更清楚您有舍入错误。在这种情况下,您通过将 0.5 分配给 nsec(即 long)来去掉所有小数位。将nsec 改为float

    【讨论】:

      【解决方案2】:

      您还尝试将小数值存储在 long 中。您要么需要将其乘以 1000,要么将 nsec 设为双倍。

      nsec=d-(double)((time_t)d);

      如果 d 为 1.5,则右侧的结果将为 0.5,当它以 nsec 存储时,它将隐式向下转换为 0。

      【讨论】:

      • 他使用的是格式标志%f,所以nsec应该是float,而不是double
      • %f 是 printf 格式标志,与您所描述的内容无关。 %f 适用于显示浮点数和双精度数。 %f 中的 f 仅表示“浮点”,并不表示单精度浮点。 %f 将显示双精度。
      • @Luke:真的吗?那么%lf 是什么? (它相关的,因为如果他使用了错误的类型,那么他正在调用 UB。)
      • 是的,l 修饰符不适用于浮点,请参阅下面链接中的“长度”。如果您的意思是%Lf,那么这是一个长双精度数,比双精度数更精确。 cplusplus.com/reference/clibrary/cstdio/printf
      • @Luke:不,我的意思是%lf。如果%fdouble 是安全的,那么OK。但是,我更喜欢 C 引用而不是 C++ 引用。 C++ 是一种不同的语言。 (并且在 C++ 的 C 标准库中存在兼容性差异。)
      【解决方案3】:

      您正在尝试将.5 分配给long,这不会发生。

      double d = 1.5;
      int i = (int)d;
      double j = d - (double)i;
      
      printf("%d %f\n",i,j);
      

      【讨论】:

      • 这种情况下的解决方案是什么。我不完全了解如何进行。请帮帮我。
      猜你喜欢
      • 2014-03-14
      • 1970-01-01
      • 1970-01-01
      • 2013-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-31
      相关资源
      最近更新 更多