спецификатор формата для double в scanf

Я написал эту программу для получения двойного ввода:

double n;
scanf("%lf",&n);
while(fgetc(stdin)!='\n')
    return 0;
printf("%lf",n);

Предполагается, что эта программа принимает двойные входные данные. При условии, что %lf является спецификатором формата для double в scanf, я использовал его. Но для ввода цифры, за которой следует e. например (3e), ввод читается без ошибок. Но во время обработки той же переменной он отбрасывает e и учитывает только 3, как показано оператором printf. В чем причина такого поведения?


person nj-ath    schedule 13.10.2014    source источник


Ответы (1)


Следуя обоснованию, приведенному в отчете о дефектах № 22 (http://www.open-std.org/jtc1/sc22/wg14/docs/rr/dr_022.html), такие функции, как scanf%lf) и strtod, должны потреблять столько входных данных, сколько удовлетворяет ожидаемому формату для плавающего точечная константа. Это означает, что они должны использовать символ e в "3e", даже если за символом e не следует фактическое значение экспоненты (значение показателя должно присутствовать в 6.4.4.2).

Это в равной степени относится к %lf и %f. В моих экспериментах на этом входе они ведут себя точно так же. (Конечно, %f требует целевой переменной типа float.)

Однако даже после использования 3 и e из входного потока я ожидал бы, что scanfstrtod) распознают "3e" как недопустимое представление числа с плавающей запятой (поскольку, опять же, 6.4.4.2 требует наличия значения экспоненты) и действовать соответственно. В моем эксперименте scanf успешно прочитал 3.0. Этого я пока не могу объяснить.

person AnT    schedule 13.10.2014
comment
@darknight: Не понимаю, что ты имеешь в виду. Я не вижу разницы в поведении %lf и %f. Стандарт определяет %lf вместо double в scanf. %f для float. - person AnT; 13.10.2014