这总是对我造成0,我不知道为什么... 互联网上的其他示例通常会造成分裂。
在代码块中,相同的代码结果正常,但是在Atom中,我有此问题。 请帮忙。
#include <stdio.h>
#include <conio.h>
#define PI 3.14
int main() {
float r,a,c;
printf("enter radius: \n");
scanf("%.2f",&r);
c = r * PI * 2;
a = r * r * PI;
printf("area:%.2f circumference:%.2f \n",c,a );
return 0;
}
答案 0 :(得分:4)
C11 7.21.6.2p3对fscanf
等人说:
3 [...]介绍了每个转换规范 由字符
%
。在%
之后,依次显示以下内容:
- 可选的禁止作业字符
*
。- 可选的大于零的十进制整数,用于指定最大字段宽度(以字符为单位)。
- 可选的长度修饰符,用于指定接收对象的大小。
- 转换说明符,用于指定要应用的转换类型。
长度修饰符表示l
中的额外字母,例如%lf
,表示double
。请注意,虽然%2f
是有效的,并且意味着只能使用2个字符的输入,但无处不说您可以编写%.2f
,即%.2f
是无效的转换规范,因此行为是不确定的(C11 7.2.6.2p13)。
答案 1 :(得分:1)
如果没有理由要使用%.2f进行扫描,只需使用%f即可
#include <stdio.h>
#include <conio.h>
#define PI 3.14
int main() {
float r,a,c;
printf("enter radius: \n");
scanf("%f",&r);
c = r * PI * 2;
a = r * r * PI;
printf("area:%.2f circumference:%.2f \n",c,a );
return 0;
}
示例:
daniel@daniel-FX503VM:~/Documents/test$ ./zero
enter radius:
1
area:6.28 circumference:3.14
printf中的.2是打印格式说明符,不应对scanf产生影响
在scanf中放置.2的地方实际上是width字段,它指定当前读取操作(可选)中要读取的最大字符数。但是,在这种情况下,以宽度为.2个字符并不有意义,因为宽度必须是整数。
如果您实际上想做的只是读两个字符,您可以说
scanf("%2f", &r);
但要警告“。”如果您只想让输出为两位小数,则上面建议的代码就足够了。如果您想在内部进行四舍五入,建议您阅读this post