You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

四位二进制转十进制转换器故障求助:输出结果异常

嘿,我仔细看了你的四位二进制转十进制的代码,问题其实挺明确的,咱们一个个说清楚:

最致命的问题:字符比较写错了

你代码里写的if (num == 1)完全不对!输入的'1'是字符常量,它在ASCII表里对应的整数值是49,不是整数1。正确的写法应该是if (num == '1')——一定要用单引号把1括起来,这样才是在判断输入的字符是不是'1'。这个错误直接导致你的累加逻辑根本没生效,结果自然不对。

第二个坑:空白字符处理乱了

你现在的逻辑是,读到空格就打印换行,但不管读的是什么(哪怕是空格、换行),都会执行power2 = power2 / 2。比如用户输入1 0 1 0*,空格会让power2多除以一次2,等你处理到真正的二进制位时,权重已经不对了,结果肯定错。

额外的小隐患:全局变量没必要

你把resultpower2声明成了全局变量,虽然这次初始化了,但如果以后要复用这段逻辑,全局变量的值不会自动重置,很容易出问题。不如把它们放到main函数里当局部变量,每次运行都重新初始化更安全。

给你修正后的代码

我调整了逻辑,加了错误处理,还优化了输入读取的问题:

#include <stdio.h>

int main(){
    int result = 0;
    int power2 = 8; // 四位二进制最高位是2^3=8
    char num;

    printf("Enter FOUR 1's and/or 0's followed by a '*'.\n");
    
    // 用" %c"跳过所有空白字符(换行、空格、制表符)
    scanf(" %c", &num);

    while (num != '*'){
        if (num == '1'){
            result += power2;
        } else if (num == '0'){
            // 是0的话不用累加,直接跳过
        } else if (num != ' '){
            // 遇到非预期字符直接报错退出
            printf("Error: Invalid character '%c' entered!\n", num);
            return 1;
        }

        // 只有处理了有效二进制位(0/1)才调整权重
        if (num == '0' || num == '1'){
            power2 /= 2;
            // 处理完四位后直接检查是否是*
            if (power2 == 0){
                scanf(" %c", &num);
                if (num != '*'){
                    printf("Error: Expected '*' after four binary digits!\n");
                    return 1;
                }
                break;
            }
        }

        scanf(" %c", &num);
    }

    printf("Decimal result: %d\n", result);
    return 0;
}

修正点说明

  1. 把变量移到main里当局部变量,避免全局变量的副作用;
  2. num == '1'正确判断字符;
  3. scanf(" %c")自动跳过空白字符,不用单独处理空格,避免权重错误;
  4. 增加了错误处理,输入非法字符或者格式不对直接提示;
  5. 只有处理有效二进制位时才调整power2,确保每一位的权重对应正确。

内容的提问来源于stack exchange,提问作者kath0n

火山引擎 最新活动