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

时间:2016-11-09 20:17:55

标签: 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");
    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);
}

我尝试过很多东西但没有任何作用。在

    printf("%d  %d\n", n1,n2 );

仅用于调试目的。

3 个答案:

答案 0 :(得分:1)

问题在于

 scanf("%d", &n1);
 scanf("%d", &n2);

n1n2的类型为double,因此使用%d格式说明符会调用undefined behavior

引用C11,章节§7.21.6.2,fscanf(),(强调我的

  

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

  

[...]除非用*表示分配抑制,否则   转换结果放在下面第一个参数指向的对象中   尚未收到转换结果的format参数。如果是这个对象   没有合适的类型,或者无法表示转换结果   在对象中,行为是未定义的。

解决方案:要打印double,您需要使用%f,要扫描值,您需要使用%lf

答案 1 :(得分:1)

变量n1n2属于double类型。但是,您使用%dprintf中的scanf格式说明符,其中int和指向int的指针。

要阅读/撰写double,请使用%f的{​​{1}}格式说明符和printf的{​​{1}}。

答案 2 :(得分:0)

您正在使用n1n2的双重数据类型。 double的打印格式说明符是%f;扫描格式为%lf%d%f每次使用n1代替n2