C 为什么我会丢失变量n2的值?

C 为什么我会丢失变量n2的值?,c,printf,double,scanf,C,Printf,Double,Scanf,我在做功课,遇到了一个问题。为什么我要松开变量的值n2 #include <stdio.h> #include <stdlib.h> int opt; double n1; double n2; int main() { printf("Hello and welcome \n"); printf("Lets do Some math! \n"); printf("Menu!\n"); printf("1- \t Areas \n");

我在做功课,遇到了一个问题。为什么我要松开变量的值
n2

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

int opt;
double n1;
double n2;

int main()
{
    printf("Hello and welcome \n");
    printf("Lets do Some math! \n");
    printf("Menu!\n");
    printf("1- \t Areas \n");
    printf("2- \t Perimetros \n");
    scanf("%d",&opt);

    switch (opt){
        case 1:
            Areas();
            break;

        case 2:
            break;
    }
    return 0;
}

void Areas(){
    printf("Area de:\n");
    printf("1- \t Quadrado\n");
    printf("2- \t Retangulo\n");
    printf("3- \t Losangulo\n");
    printf("1- \t Circulo\n");
    scanf("%d", &opt);

    switch (opt){
        case 1:
            Medidas("dos lados.");
            printf("%d  %d\n", n1,n2 );
            break;

        case 2:
            break;
    }
}

void Medidas(char string[]){
    printf("Introduzir as Medidas %s \n", string);
    scanf("%d", &n1);
    printf("Next\n");
    scanf("%d", &n2);
}
仅用于调试目的。

问题出在

 scanf("%d", &n1);
 scanf("%d", &n2);
n1
n2
属于
double
类型,因此使用
%d
格式说明符调用

引用
C11
,第§7.21.6.2章,用于
fscanf()
,(重点)

d

匹配可选带符号的十进制整数,其格式与 应为strtol函数的主题序列,值为10 对于基本参数相应的参数应是指向 有符号整数。

[…]除非分配抑制由a*表示,否则 转换的结果被放置在下面的第一个参数所指向的对象中 尚未收到转换结果的格式参数。如果这个物体 没有适当的类型,或者无法表示转换的结果 在对象中,行为是未定义的

解决方案:对于打印
double
s,您需要使用
%f
,对于扫描值,您需要使用
%lf
问题在于

 scanf("%d", &n1);
 scanf("%d", &n2);
n1
n2
属于
double
类型,因此使用
%d
格式说明符调用

引用
C11
,第§7.21.6.2章,用于
fscanf()
,(重点)

d

匹配可选带符号的十进制整数,其格式与 应为strtol函数的主题序列,值为10 对于基本参数相应的参数应是指向 有符号整数。

[…]除非分配抑制由a*表示,否则 转换的结果被放置在下面的第一个参数所指向的对象中 尚未收到转换结果的格式参数。如果这个物体 没有适当的类型,或者无法表示转换的结果 在对象中,行为是未定义的


解决方案:对于打印
double
s,您需要使用
%f
,对于扫描值,您需要使用
%lf
变量
n1
n2
的类型为
double
。但是,您使用的是
printf
scanf
中的
%d
格式说明符,它们需要
int
和指向
int
的指针


要读取/写入
double
,请使用
printf
%f
格式说明符和
%lf
scanf

变量
n1
n2
的类型为
double
。但是,您使用的是
printf
scanf
中的
%d
格式说明符,它们需要
int
和指向
int
的指针


要读取/写入
double
,请为
printf
使用
%f
格式说明符,为
scanf使用
%lf
格式说明符
n1
n2
。 double的打印格式说明符是
%f
;扫描格式为
%lf

对于
n1
n2
每次使用
%f
而不是
%d
,您对
n1
n2
使用的是双数据类型。 double的打印格式说明符是
%f
;扫描格式为
%lf

不要使用
%d
,每次使用
%f
来表示
n1
n2

您可能应该澄清您的最后一句话;在调用
scanf()
系列时使用
%f
将无法使
n1
成为
双精度
——但对于
printf()
系列来说,这很好。您可能应该澄清最后一句话;在调用
scanf()
系列时使用
%f
将无法使用
n1
作为
双精度
-但是对于
printf()
系列来说这很好。打开编译器警告。应该捕捉到双n1;scanf(“%d”&n1)打开编译器警告。应该捕捉到双n1;scanf(“%d”&n1)