Вопрос о scanf () с спецификатором lf и printf () с спецификатором lf?

Я изучаю 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 требует, чтобы вход был идеальным, и это не всегда происходит, когда люди вводят данные.