C代码的非逻辑输出

时间:2016-08-25 06:39:35

标签: c pointers char nested-if

我写了一些以下代码。

#include "stdio.h"

int main(){
    float t,res;
    char c;
    scanf("%f",&t); 
    getchar();
    scanf("%s",&c);
    if (c=='R') res = 4/5 * t;
    else if (c=='F') res = (9/5 * t) + 32;
    else if (c=='K') res = t + 273;
    printf("%.2f",&res);
    return 0;
}

当我给出t = 25和c ='R'时,我不知道为什么输出显示为0.00。控制台看起来像这样。

25
R
0.00

有人会给我一个解释吗?

4 个答案:

答案 0 :(得分:5)

  • scanf("%s",&c);很有可能导致超出范围的访问,这会调用未定义的行为。使用scanf("%c",&c);%c代替%s)只能阅读一个字符。
  • printf("%.2f",&res);将通过将具有错误类型的数据传递给printf()来调用未定义的行为。使用printf("%.2f",res);(不使用&)打印类型为double(或float的数据,该数据将在可变长度参数中自动转换为double
  • 表达式res = 4/5 * tres = (9/5 * t) + 32可能无法执行您想要的操作,因为4/59/5是整数除法,其中余数被截断。尝试使用res = 4.f/5 * tres = (9.f/5 * t) + 32
  • 您应该检查scanf()是否成功并且数据读取是否有效,以便不使用具有自动存储持续时间的未初始化变量的值来调用未定义行为,这些变量是不确定的

答案 1 :(得分:2)

  • 首先,您可以通过以下方式使用printf

    printf("%.2f",&res);
    

    但根据您要打印的内容,您应将其更改为:

    printf("%.2f", res);
    
  • 其次,在阅读简单字符时,请修改以下行:

    scanf("%s",&c);
    

    到:

    scanf("%c", &c);
    
  • 最后也是最重要的是声明:

    res = 4/5 * t;
    

    将计算整数商(在0的情况下会给出4/5,但您想要进行浮点除法。所以你应该把它改成:

    res = (float)4/5 * t;
    

    或:

    res = 4/(float)5 * t;
    

    由于该部门的两名成员之一需要float才能获得您想要的结果。

    当然,您也可以这样做而不是投射:

    res = 4.0/5 * t;
    

    或:

    res = 4/5.0 * t;
    

    同样也适用于9/5*t,应更改为9.0/5*t9/5.0*t

答案 2 :(得分:2)

当然,

printf("%.2f",res);  // without &

4.0/5   9.0/5  // .0 makes literal of double type

或更好

4.0F/5   9.0F/5  // .0F makes literal of float type

在表达式中。

但我的第二个建议是以下代码

scanf("%f",&t); 
getchar(); // cleaning the input stream from one `'\n'`
scanf("%s",&c);

最好将此部分写为

scanf("%f",&t);
while (getchar() != '\n'); // cleaning the input stream from everithing
c = getchar(); // reading one character

这种方法允许在输入类似

之后读取正确的字符
  

1.34abdfsk

     

[R

在这种情况下,abdfsk以及\n将被循环while (getchar() != '\n');

跳过

答案 3 :(得分:1)

更改

scanf("%s",&c);

scanf("%c",&c); // %c format specifier for character

更改

printf("%.2f",&res);

printf("%.2f",res); // No address of operator required

res = 4/5 * t;

/& *具有相同的优先级,因此表达式从左到右计算。因此,操作员事件很重要。

既然4& 5被评估为整数,除法产生零 这就是你结果为零的原因。要强制编译器将4/5视为浮点数,您可以明确地提及至少一个值为float:

res = 4/5.0F * t;