Разбор пользовательского ввода с использованием time_t - PullRequest
0 голосов
/ 28 марта 2011

Моя идея состоит в том, что если пользователь вводит t = 2.5, то я извлекаю 2 и 0.5 отдельно в 2 разных переменных.Но я не могу этого сделать.

Вот код:

$ 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

Ответы [ 3 ]

1 голос
/ 28 марта 2011

Ваш вывод нарушен. Вы фактически пишете значение 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 a float.

0 голосов
/ 28 марта 2011

Вы также пытаетесь сохранить дробное значение в лонге.Вам нужно либо умножить это на 1000, либо сделать nsec двойным.

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

Если d равно 1,5, результат для правой части будет равен 0,5, что будет неявнопонижается до 0, когда оно сохраняется в nsec.

0 голосов
/ 28 марта 2011

Вы пытаетесь присвоить .5 для long, что не произойдет.

double d = 1.5;
int i = (int)d;
double j = d - (double)i;

printf("%d %f\n",i,j);
...