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)代码>