Чтение двойных значений с помощью scanf в c
Я пытаюсь прочитать 2 значения, используя scanf() в C, но значения, которые система записывает в память, не совпадают с моими введенными значениями. Вот код:
double a,b;
printf("--------\n"); //seperate lines
scanf("%ld",&a);
printf("--------\n");
scanf("%ld",&b);
printf("%d %d",a,b);
Если я ввожу 1 и 2, CMD возвращает правильное значение, но b = -858993460 Вот что я уже пробовал: использовать float или int вместо double, используя scanf_s, используя scanf("%d или% f для% i или% li или% lf или% e или%g), используя fflush(stdin) для очистки буфера клавиатуры, сначала читая в b, пробуя все возможные комбинации. Я обнаружил, что есть проблема с длиной double в 32-битной ОС, так что вы вынуждены использовать scanf("%lf", &f) для чтения в двойном формате. Независимо от того, что я делаю, второе значение всегда неверно.
Я использую MS VS Express 2012 для рабочего стола на Windows 7 32-битной ОС.
7 ответов
Использовать %lf
спецификатор формата для чтения двойного:
double a;
scanf("%lf",&a);
В Википедии есть хорошая ссылка для доступных спецификаторов формата.
Вам нужно будет использовать %lf
спецификатор формата для распечатки результатов:
printf("%lf %lf",a,b);
Насколько я знаю %d
означает десятичное число, которое является числом без десятичной точки. если вы хотите загрузить двойное значение, используйте %lf
конвертация (long float). для printf ваши значения неверны по той же причине, %d
используется только для целых (и, возможно, символов, если вы знаете, что делаете).
Пример:
double a,b;
printf("--------\n"); //seperate lines
scanf("%lf",&a);
printf("--------\n");
scanf("%lf",&b);
printf("%lf %lf",a,b);
Вы используете неправильную последовательность форматирования для double
, вы должны использовать %lf
вместо %ld
:
double a;
scanf("%lf",&a);
Спецификатор формата в printf
должно быть %f
за doubl
типы данных с float
данные в конечном итоге преобразуются в double
типы данных внутри printf
,
Там нет положения для печати float
данные. Пожалуйста, найдите обсуждение здесь: Правильный спецификатор формата для double в printf
Используйте эту строку кода при сканировании второго значения:scanf(" %lf", &b);
также замените все%ld на%lf.
Это проблема, связанная с буфером входного потока. Вы также можете использовать fflush(stdin); после первого сканирования, чтобы очистить входной буфер, а затем второй scanf будет работать должным образом. Альтернативный способ - разместить getch(); или getchar(); функция после первой строки scanf.
Правильные способы:
double a,b;
printf("--------\n"); //seperate lines
scanf("%lf",&a); //%lf is long float numbers
printf("--------\n");
scanf("%lf",&b);
printf("%f %f",a,b); //%f float number
С помощью %lf
поможет вам в решении этой проблемы.
Используйте:
scanf("%lf",&doub)