Разбор пользовательского ввода с помощью time_t

Моя идея заключается в том, что если пользователь вводит 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

person RajSanpui    schedule 28.03.2011    source источник


Ответы (3)


Ваш выход сломан. На самом деле вы дважды пишете значение 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.

person Lightness Races in Orbit    schedule 28.03.2011

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

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

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

person Luke    schedule 28.03.2011
comment
Он использует флаг формата %f, поэтому nsec должен быть float, а не double. - person Lightness Races in Orbit; 28.03.2011
comment
%f является флагом форматирования printf и не имеет отношения к тому, что вы описываете. %f подходит для отображения как вещественных, так и двойных значений. f в %f просто означает «с плавающей запятой», это не означает с плавающей запятой одинарной точности. %f будет отображать двойное значение. - person Luke; 28.03.2011
comment
@ Люк: Правда? Тогда что такое %lf? (Это связано, потому что, если он использует неправильный тип, он вызывает UB.) - person Lightness Races in Orbit; 28.03.2011
comment
Да, действительно, модификатор l не применяется к числам с плавающей запятой, см. «длина» в ссылке ниже. Если вы имеете в виду %Lf, то это длинное двойное число, которое точнее, чем двойное. cplusplus.com/reference/clibrary/cstdio/printf - person Luke; 28.03.2011
comment
@Luke: Нет, я имел в виду %lf. Если %f безопасно с double, то ОК. Однако я бы предпочел ссылку C ссылке C++. С++ - это другой язык. (И существуют существуют различия совместимости в стандартной библиотеке C++ C++.) - person Lightness Races in Orbit; 28.03.2011
comment
codingunit.com/ предполагает, что l модификатор, безусловно, применяется. - person Lightness Races in Orbit; 28.03.2011
comment
l используется и допустимо для scanf, но не имеет значения для printf из-за продвижения аргумента. Когда используется %f, числа с плавающей запятой и двойные числа преобразуются в двойные, поэтому нет никакой разницы, и %lf будет обрабатываться точно так же, как %l при использовании в printf. Из-за его использования в scanf люди часто путаются и думают, что его следует использовать и с printf. Просто примечание: printf является частью стандартной библиотеки и не является частью ни языка программирования C, ни C++. Вы правы, ваш синтаксис действителен. Но это не нужно. - person Luke; 28.03.2011
comment
stackoverflow.com/questions/210590/ поддерживает мое утверждение выше. - person Luke; 28.03.2011
comment
@Luke: Хорошо, тогда это круто. :) (Кстати, в C++ библиотека является частью языка. Не уверен, можно ли то же самое сказать о C, но я все равно явно имел в виду тело языка + библиотеки в целом. ) - person Lightness Races in Orbit; 28.03.2011

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

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

printf("%d %f\n",i,j);
person Brian Roach    schedule 28.03.2011
comment
Какое решение в таком случае. Я не совсем понимаю, как действовать. Помогите мне, пожалуйста. - person RajSanpui; 28.03.2011