关于使用lf说明符的scanf()和使用lf说明符的printf()的问题?

时间:2011-03-07 02:47:46

标签: c printf scanf

我正在学习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 个答案:

答案 0 :(得分:4)

%ld格式字符串表示它希望在long signed int中读取,但您传递的却是double。您应该使用%lf格式说明符来表示您需要double

请注意,对于scanfl需要doublefloat s需要{}},而printf则需要l%lf中的%f无效:%lffloat的{​​{1}}和double都有相同的输出默认参数提升。

答案 1 :(得分:0)

代表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". 

read this.

答案 2 :(得分:0)

与scanf和printf的数据保持一致。 加上%lf(double),%f(浮动),%lld(long long int)我在windows中遇到了问题。它在Windows中没有很好地实现(如果你问的话,是msvcrt.dll)。

答案 3 :(得分:-1)

最好使用gets(),然后尝试解析并将输入的字符串转换为所需类型。

因为所有内容最初都是作为字符串输入的,所以更容易处理错误的输入。

scanf要求输入是完美的,并且当人类输入数据时并不总是这样。