c - 基本的,关于说明符

标签 c

#include<stdio.h>

int main(){
  double n1,n2;
  float n3;
  printf("input 2 flt:");
  scanf("%lf %lf",&n1,&n2);
  n3 = n1 * n2;
  printf("n1 * n2 = %.2lf",n3);
}

当我设置n1,n2为float时,n3无法正确计算,为什么?

代码最初来自a online tutorial , 修改以测试 %lf 的功能。

最佳答案

因为您需要使用正确的 scanf() 说明符。

如果您使用float,则"%f",如果您使用double,则"%lf" .

对于float,你可以这样做

#include<stdio.h>

int main()
{
    float n1, n2;
    float n3;

    printf("input 2 flt:");
    if (scanf("%f%f", &n1, &n2) == 2) {
        n3 = n1 * n2;
        printf("n1 * n2 = %.2f",n3);
    }
}

对于double

#include<stdio.h>

int main()
{
    double n1, n2;
    double n3;

    printf("input 2 flt:");
    if (scanf("%lf%lf", &n1, &n2) == 2) {
        n3 = n1 * n2;
        printf("n1 * n2 = %.2f",n3);
    }
}

请注意,在使用 n1n2 的值之前,我检查了 scanf() 是否返回了 2,这是因为如果您不检查程序可能会调用未定义的行为,因为 n1 和/或 n2 未被初始化。

您的 printf() 说明符也是错误的,对于 floatdouble 您可以使用 "%f",阅读文档。

关于c - 基本的,关于说明符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45782899/

相关文章:

c - GCC/x86 内联汇编 : How do you tell gcc that inline assembly section will modify %esp?

c - io完成端口问题,每个GetQueuedCompletionStatus调用多个wsarecv或wsasend

c - 如何使用 eof 获取用户输入的整数,直到他按下 Enter?

c - 使用 libgcrypt 签名,崩溃

c - 下面的数组初始化方法与数组边界检查的上下文有何不同?

c - 方阵与fork()的乘法;在 C

检查 TCP 套接字上的传入接口(interface)

c++ - sscanf 麻烦吗?

c - 定点表示的符号

c - 链表 - 段错误