You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言数组实现二进制转十进制无输出问题排查与优化

二进制转十进制代码错误排查与优化

问题描述

尝试将以整数数组形式存储的二进制数转换为十进制数,通过对每个元素做数学运算累加结果。当前代码运行后无任何输出,预期输出为 Result: 59(对应二进制数组 {1,1,1,0,1,1} 的十进制值)。

原代码如下:

#include <math.h>
#include <stdio.h>
#include <stdlib.h>

int binToint(int arrName[]);

int binToint(int arrName[]) {
  int index;
  int length, j, x = 0; //initializing length, x and j to 0

  for (index = 0; arrName[index] == 1 || arrName[index] == 0; index++)
    ++length;
  j = length;

  for (index = 0; index < length; index++) {
    --j;
    if (j < 0)
      break;

    x += arrName[index] * ((int)pow(10, j)); //decimal = binary x 10^index of digit
  }
  printf("Result: %d", x);
  return x;
}

int main(void) {

  int tester[] = {1,1,1,0,1,1}; //i used the commas so that each digit will be stored separately
  binToint(tester); //calling the function
}

错误分析

  1. 局部变量未初始化:length 是局部变量,C语言中局部变量默认不会初始化为0,初始值是随机垃圾值,导致第一个循环的计数逻辑完全错误。
  2. 数组越界访问:tester 数组没有终止标记,第一个循环条件 arrName[index] == 1 || arrName[index] == 0 会持续访问数组之外的内存区域,导致程序崩溃或进入死循环,因此无法执行到后续的输出代码。
  3. 进制转换逻辑错误:二进制转十进制的计算应该是每一位乘以 2 的对应次方,而非 10 的次方——10^j 是用于十进制字符串转整数的逻辑,完全不符合二进制转十进制的规则。

修正后的代码

通过传入数组长度的方式避免越界问题,同时修正转换逻辑:

#include <stdio.h>

// 新增数组长度参数,避免越界
int binToint(int arrName[], int length) {
  int x = 0;
  for (int index = 0; index < length; index++) {
    // 用整数运算替代pow,避免浮点数精度问题
    x = x * 2 + arrName[index];
  }
  printf("Result: %d\n", x);
  return x;
}

int main(void) {
  int tester[] = {1,1,1,0,1,1};
  // 计算数组长度:总字节数除以单个元素字节数
  int arrLength = sizeof(tester) / sizeof(tester[0]);
  binToint(tester, arrLength);
  return 0;
}

运行这段代码后,会正确输出:

Result: 59

优化建议

  • 避免使用pow函数:pow是浮点数运算函数,存在精度丢失风险(比如pow(2,3)可能返回7.999999999,强制转int后变成7),用x = x * 2 + arrName[index]这种整数运算方式更高效且准确。
  • 添加输入验证:在转换函数中检查数组元素是否只有0和1,避免非法输入导致错误结果:
    if (arrName[index] != 0 && arrName[index] != 1) {
        printf("Error: 数组元素只能是0或1\n");
        return -1;
    }
    
  • 实现字符串转数组的方案:如果想从字符串接收二进制数再转数组,可以参考以下代码片段:
    #include <string.h>
    
    int main(void) {
        char binStr[] = "111011";
        int arr[strlen(binStr)];
        for (int i = 0; i < strlen(binStr); i++) {
            // 字符转整数:'0'的ASCII码是48,减去即可得到对应数字
            arr[i] = binStr[i] - '0';
        }
        binToint(arr, strlen(binStr));
        return 0;
    }
    
  • 使用const修饰输入数组:如果函数不会修改输入数组,添加const关键字可以提升代码安全性和可读性:
    int binToint(const int arrName[], int length)
    

内容的提问来源于stack exchange,提问作者Abdurrahman Muhammad Kabir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 01:31:18