Вопрос о scanf () со спецификатором lf и printf () со спецификатором lf? - PullRequest
1 голос
/ 07 марта 2011

Я изучаю C и у меня есть следующий код:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

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

Кто-нибудь может объяснить, почему это так, пожалуйста?

Большое спасибо.

Ответы [ 4 ]

4 голосов
/ 07 марта 2011

Строка формата %ld означает, что она ожидает чтения в long signed int, но вместо этого вы передаете double.Вместо этого вы должны использовать спецификатор формата %lf, чтобы сказать, что вы хотите double.

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

0 голосов
/ 07 марта 2011

Соответствует данным с scanf и printf.Плюс для% lf (double),% f (float),% lld (long long int) у меня возникла проблема в Windows.Это не очень хорошо реализовано в Windows (msvcrt.dll, если вы спросите).

0 голосов
/ 07 марта 2011

Лучше использовать gets(), а затем попытаться проанализировать и преобразовать введенную строку в нужный тип.

Потому что изначально все вводится как строка, и легче обрабатывать неверные данные.

scanf требует идеального ввода, а это не всегда происходит, когда люди вводят данные.

0 голосов
/ 07 марта 2011

для вашего 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". 

прочитайте это.

...