鱼C论坛

 找回密码
 立即注册
查看: 1577|回复: 2

[已解决]求助help

[复制链接]
发表于 2023-11-7 16:59:38 | 显示全部楼层 |阅读模式
5鱼币
#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语言。
最佳答案
2023-11-7 16:59:39
关于C语言程序只执行else语句的问题

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

在你提供的代码中,读取xingbieyundongyinshi这三个字符时,可能会受到之前scanf的影响。如果在读取ab后没有清除输入缓冲区,那么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格式字符串中加入空格,可以避免上一个输入对后续字符输入的干扰,从而确保程序能够按预期执行。

球一个最佳答案谢谢啦!这对我非常重要!

最佳答案

查看完整内容

关于C语言程序只执行else语句的问题 这是因为在C语言中,使用scanf函数读取字符时会遇到一个潜在的问题。当我们使用%c格式符来读取字符时,它会读取输入缓冲区中的下一个字符,包括空格、制表符和换行符。这可能导致意外的行为。 在你提供的代码中,读取xingbie、yundong和yinshi这三个字符时,可能会受到之前scanf的影响。如果在读取a和b后没有清除输入缓冲区,那么xingbie很可能会受到上一个scanf的干扰而被赋予意外的值。 为 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-11-7 16:59:39 | 显示全部楼层    本楼为最佳答案   
关于C语言程序只执行else语句的问题

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

在你提供的代码中,读取xingbieyundongyinshi这三个字符时,可能会受到之前scanf的影响。如果在读取ab后没有清除输入缓冲区,那么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格式字符串中加入空格,可以避免上一个输入对后续字符输入的干扰,从而确保程序能够按预期执行。

球一个最佳答案谢谢啦!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-11-7 17:00:09 | 显示全部楼层
这个程序中只有else语句执行的原因是在使用scanf函数读取字符时,可能会出现换行符的问题。在你的代码中,scanf函数读取了两个整数后,接着读取字符时,会读取到之前输入的换行符,而不是你期望的字符。因此,else语句中的代码会被执行。

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

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

这样,空格字符将会吸收掉换行符,然后正确读取字符,使得你的if语句能够按照预期执行。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-24 03:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表