王小二° 发表于 2023-11-7 16:59:38

求助help

#include <stdio.h>
int main()
{
        int a,b;
        char xingbie,yundong,yinshi;
        float h;
        scanf("%d%d%c%c%c",&a,&b,&xingbie,&yundong,&yinshi);
        if(xingbie=='F')
                h=(0.923*a+b)/2;
        else h=(a+b)*0.54;
        if(yundong=='Y') h=h*1.02;
        if(yinshi=='Y') h=h*1.015;
        printf("%.2f",h);
        return 0;
}
请问这个程序为什么会只有else语句执行,C语言。

Mike_python小 发表于 2023-11-7 16:59:39

关于C语言程序只执行else语句的问题

这是因为在C语言中,使用scanf函数读取字符时会遇到一个潜在的问题。当我们使用%c格式符来读取字符时,它会读取输入缓冲区中的下一个字符,包括空格、制表符和换行符。这可能导致意外的行为。

在你提供的代码中,读取xingbie、yundong和yinshi这三个字符时,可能会受到之前scanf的影响。如果在读取a和b后没有清除输入缓冲区,那么xingbie很可能会受到上一个scanf的干扰而被赋予意外的值。

为了解决这个问题,你可以在每次读取字符之前加上一个空格,让scanf跳过可能残留在缓冲区中的空白符。修改后的代码如下所示:


#include <stdio.h>
int main() {
    int a, b;
    char xingbie, yundong, yinshi;
    float h;
    scanf("%d %d %c %c %c", &a, &b, &xingbie, &yundong, &yinshi);
    if (xingbie == 'F')
      h = (0.923 * a + b) / 2;
    else
      h = (a + b) * 0.54;
    if (yundong == 'Y')
      h = h * 1.02;
    if (yinshi == 'Y')
      h = h * 1.015;
    printf("%.2f", h);
    return 0;
}


通过在scanf格式字符串中加入空格,可以避免上一个输入对后续字符输入的干扰,从而确保程序能够按预期执行。

球一个最佳答案谢谢啦!这对我非常重要!{:10_254:}{:10_254:}{:10_254:}

isdkz 发表于 2023-11-7 17:00:09

这个程序中只有else语句执行的原因是在使用scanf函数读取字符时,可能会出现换行符的问题。在你的代码中,scanf函数读取了两个整数后,接着读取字符时,会读取到之前输入的换行符,而不是你期望的字符。因此,else语句中的代码会被执行。

要解决这个问题,你可以在读取字符之前使用一个空格字符来清除换行符。修改scanf函数的调用如下:

scanf("%d%d %c%c%c",&a,&b,&xingbie,&yundong,&yinshi);

这样,空格字符将会吸收掉换行符,然后正确读取字符,使得你的if语句能够按照预期执行。
页: [1]
查看完整版本: 求助help