【问题标题】:Reading in double values with scanf in c在 c 中使用 scanf 读取双精度值
【发布时间】:2023-03-13 06:57:01
【问题描述】:

我尝试在 C 中使用 scanf() 读取 2 个值,但系统写入内存的值不等于我输入的值。代码如下:

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 or %f for %i or %li or %lf or %e or %g),使用 fflush(stdin) 清除键盘缓冲区,读取 b首先,尝试所有可能的组合。我发现在 32 位操作系统上 double 的长度存在问题,所以你不得不使用 scanf("%lf", &f) 来读取 double。不管我做什么,第二个值总是错误的。

我在 Windows 7 32 位操作系统上使用 MS VS express 2012 for Desktop。

【问题讨论】:

  • 回滚到第 3 版,因为更改导致答案无法理解。

标签: c scanf conversion-specifier


【解决方案1】:

使用%lf 格式说明符读取双精度:

double a;
scanf("%lf",&a);

维基百科有一个decent reference 用于可用的格式说明符。

您还需要使用%lf 格式说明符来打印结果:

printf("%lf %lf",a,b);

【讨论】:

  • 已经试过了,只对第一个值有效,第二个还是错。
  • 虽然我很喜欢 Wikipedia,但对于 OP (+1) 来说,一本不错的 C 基础书籍可能是更好的推荐
  • @user1880009 您仍在使用%d 格式说明符来打印结果。这导致只有 4 个字节的 double 被读取并解释为 int。您还需要在这里使用%lf 格式说明符。我已经更新了我的答案以显示这一点。
  • 在 C99 中添加了 %lf 打印双精度;如果您想与旧版本的 C 兼容,则可以使用 %f 来打印 floatdouble
  • 告诉自己:%lf = Long Float = double.
【解决方案2】:

据我所知%d 表示十进制,即不带小数点的数字。如果要加载双精度值,请使用%lf 转换(长浮点数)。对于 printf,您的值出于同样的原因是错误的,%d 仅用于整数(如果您知道自己在做什么,也可能是字符)数字。

例子:

double a,b;
printf("--------\n"); //seperate lines
scanf("%lf",&a);
printf("--------\n"); 
scanf("%lf",&b);
printf("%lf %lf",a,b);

【讨论】:

    【解决方案3】:

    您对double 使用了错误的格式顺序,您应该使用%lf 而不是%ld

    double a;
    scanf("%lf",&a);
    

    【讨论】:

      【解决方案4】:

      printf 中的格式说明符对于 doubl 数据类型应该是 %f,因为 float 数据类型最终会转换为 printf 中的 double 数据类型。

      没有规定打印float 数据。请在此处找到讨论:Correct format specifier for double in printf

      【讨论】:

      • 虽然这是真的,但问题是关于 scanf,它在历史上的行为与 printf 不同,直到 C99 才支持 %lf。与问题所在的 scanf 不同。
      【解决方案5】:

      扫描第二个值时使用这行代码: scanf(" %lf", &b); 还将所有 %ld 替换为 %lf。

      这是与输入流缓冲区有关的问题。您也可以使用 fflush(stdin);在第一次扫描以清除输入缓冲区之后,第二次 scanf 将按预期工作。另一种方法是放置一个 getch();或 getchar();在第一个 scanf 行之后起作用。

      【讨论】:

        【解决方案6】:

        使用%lf 将帮助您解决这个问题。

        使用:

        scanf("%lf",&doub)
        

        【讨论】:

        • 这个答案有什么新的/不同的?在此之前的 4 年已经发布了相同的内容。
        猜你喜欢
        • 2015-06-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多