C程序中的计算结果始终为0

时间:2019-01-16 22:44:17

标签: c

这总是对我造成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;
}

2 个答案:

答案 0 :(得分:4)

C11 7.21.6.2p3fscanf等人说:

  

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