Я изучаю C, и у меня есть следующий код:
#include #include #include int main(int argc, char *argv[]) { double x; printf("x = "); scanf("%ld", &x); printf("x = %lf\n", x); system("PAUSE"); return 0; }
(Я использую Dev C4.9, Windows XP SP3)
Когда я запускаю вышеуказанную программу и ввел 5.3; программа напечатана x = 0.000000
Может ли кто-нибудь объяснить, почему это так, пожалуйста?
Большое спасибо.
Строка формата %ld
означает, что она ожидает чтения в long signed int
, но вы передаете ее вместо double
. Вместо этого вы должны использовать спецификатор формата %lf
, чтобы сказать, что вам нужен double
.
Обратите внимание, что для scanf
l
требуется для double
s (и требуется, чтобы он отсутствовал для float
s), тогда как для printf
l
в %lf
не имеет эффекта: оба %f
и %lf
имеют одинаковый вывод для обоих float
s и double
s, из-за поддержки аргументов по умолчанию.
для вашего scanf
ld:
same as "%d" except argument is "long" integer. Since "long" is the same as "int" on GCOS8,this is the same as "%d". However, the compiler will warn you if you specify "%ld" but pass a normal "int", or specify "%d" but pass a "long".
для вашего printf
lf:
same as "%f" except argument is "long double". Since "long double" is the same as "double" on GCOS8, this is the same as "%f".
прочитай это.
Соблюдайте данные с помощью scanf и printf. Плюс для% lf (double),% f (float),% lld (long long int) У меня возникла проблема с windowsми. Это не очень хорошо реализовано в windows (msvcrt.dll, если вы спросите).
Лучше использовать gets()
а затем попытаться проанализировать и преобразовать введенную строку в нужный тип.
Потому что все вводится сначала как строка, и легче обрабатывать плохой ввод.
scanf требует, чтобы вход был идеальным, и это не всегда происходит, когда люди вводят данные.