Scanf не работает. нужно читать дважды с консоли - PullRequest
6 голосов
/ 25 марта 2012

Я не уверен, что делаю неправильно, но я не могу прочитать дабл с консоли.Чтение это отлично работает по некоторым причинам.Я использую Xcode.

double n1;

// get input from the user
printf("Enter first number: ");
scanf("%f", &n1);

printf("%f", n1);

Это всегда будет печатать 0 независимо от того, что я ввожу.

Ответы [ 3 ]

7 голосов
/ 25 марта 2012

%f ищет поплавок, а не двойник. Если вы хотите использовать двойной, используйте формат %lf.

Помимо этого, clang предупреждает об этом без каких-либо дополнительных флагов, gcc 4.6 не предупреждает об этом даже при -Wall -Wextra -pedantic.

5 голосов
/ 25 марта 2012

%f предназначен для single precision floating-point value (число с плавающей запятой).Нужный спецификатор формата - %lf, что означает long precision floating-point value (double).

2 голосов
/ 25 марта 2012

Все о том, как данные хранятся в памяти.Позвольте мне сначала сказать, как долго и float хранятся в памяти.

  • Двойной (long float, 64 бита) хранится в памяти как или this (нотация с прямым порядком байтов),
  • Где в виде числа с плавающей запятой (32 бита) хранится как this (нотация с прямым порядком байтов).Также взгляните на это "en.wikipedia.org/wiki/Floating_point#Internal_representation" (все типы данных с плавающей запятой)

Так что здесь вы просите принять ввод как %f (то есть с плавающей запятой,что составляет 4 байта, но double - это 8 байтов), поэтому компилятор берет данные из консоли и преобразует их в тип с плавающей запятой и сохраняет их в ячейке памяти (которая на самом деле составляет 8 байтов) переменной (здесь n1).

...