我正在上学,我遇到了一个问题。为什么我会松开变量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 );
仅用于调试目的。
答案 0 :(得分:1)
问题在于
scanf("%d", &n1);
scanf("%d", &n2);
n1
和n2
的类型为double
,因此使用%d
格式说明符会调用undefined behavior。
引用C11
,章节§7.21.6.2,fscanf()
,(强调我的)
d
匹配一个可选的带符号十进制整数,其格式与 期望strtol函数的主题序列的值为10 对于基本参数。 相应的参数应该是指针 有符号整数。
和
[...]除非用*表示分配抑制,否则 转换结果放在下面第一个参数指向的对象中 尚未收到转换结果的format参数。如果是这个对象 没有合适的类型,或者无法表示转换结果 在对象中,行为是未定义的。
解决方案:要打印double
,您需要使用%f
,要扫描值,您需要使用%lf
。
答案 1 :(得分:1)
变量n1
和n2
属于double
类型。但是,您使用%d
和printf
中的scanf
格式说明符,其中int
和指向int
的指针。
要阅读/撰写double
,请使用%f
的{{1}}格式说明符和printf
的{{1}}。
答案 2 :(得分:0)
您正在使用n1
和n2
的双重数据类型。
double的打印格式说明符是%f
;扫描格式为%lf
。
%d
和%f
每次使用n1
代替n2
。