scanf собирает неверный ввод

 #include<stdio.h> 
 int main(void)
 {
      double c;
      scanf("%f", &c);
      printf("%f", c);
 }

Это отрывок из программы, которую я пытаюсь написать, но у меня возникает та же проблема с чем-то таким простым. когда я запускаю это и ввожу «1.0», он печатает «0,007812». Я просмотрел несколько предыдущих вопросов, похожих на мой, и не смог найти подходящего ответа.


person rawrdid    schedule 01.04.2017    source источник
comment
Вы видели те об использовании неправильного спецификатора формата для двойных?   -  person ThingyWotsit    schedule 01.04.2017


Ответы (3)


Вам нужно использовать "%lf" для двойного.

Это предупреждение компилятора clang.

предупреждение: формат указывает тип 'float *', но аргумент имеет тип 'double *' [-Wformat] scanf("%f", &c);

Вот справочник по сканированию. Это формат %[*][width][length]specifier. Спецификатор для «числа с плавающей запятой» — f. Поэтому мы используем %f для чтения float x. Чтобы прочитать double x, нам нужно указать длину как l. Комбинированный формат %lf.

person Peng Zhang    schedule 01.04.2017
comment
Вы попадаете в самый важный момент. включите предупреждения в строке компиляции (например, -Wall -Wextra) и не принимайте код, пока он не скомпилируется без предупреждений. Отличная работа. - person David C. Rankin; 01.04.2017

результатПопробуйте %lf вместо %f

#include<stdio.h>

int main()
{
double c;
scanf("%lf",&c);
printf("%lf",c);
return 0;
}

Вы использовали %f, который используется для обычного типа данных float. поскольку вы указали double , вам нужно использовать %lf , что является длинным числом с плавающей запятой. он читается как двойной. надеюсь, это поможет вам.

person Rahul Ajith    schedule 01.04.2017

"%f" - это (или по крайней мере один) правильный формат для двойного числа. Формата для числа с плавающей запятой не существует, потому что если вы попытаетесь передать число с плавающей запятой в printf, оно будет повышено до удвоения до того, как printf получит его1. "%lf" также приемлем в соответствии с текущим стандартом - l указано как не имеющее никакого эффекта, если за ним следует спецификатор преобразования f (среди прочего).

Обратите внимание, что это единственное место, где строки формата printf существенно отличаются от строк формата scanf (и fscanf и т. д.). Для вывода вы передаете значение, которое будет повышено с float до double при передаче в качестве параметра с переменным числом переменных. Для ввода вы передаете указатель, который не продвигается, поэтому вы должны сообщить scanf, хотите ли вы прочитать число с плавающей запятой или двойное, поэтому для scanf %f означает, что вы хотите прочитать число с плавающей запятой, а %lf означает, что вы хотите чтобы прочитать двойное число (и, что важно, для длинного двойного значения вы используете %Lf либо для printf, либо для scanf).

person Huzefa Bandookwala    schedule 01.04.2017
comment
Вы можете вернуться к man scanf и немного изменить свой ответ. - person David C. Rankin; 01.04.2017