C++十进制二进制互转函数编译错误及char数组问题求助
问题排查与修复
编译错误原因
- 默认参数重复定义:C++规则要求函数默认参数只能在声明处指定,你在
decToBin和binToDec的声明中已经设置了i=0的默认值,函数定义时重复写了int i=0,触发编译报错。 - break使用位置错误:
break语句仅能在循环或switch分支中使用,你在decToBin的递归终止判断中用了break,递归终止应该用return语句。
其他潜在逻辑问题
pow函数返回double类型,做大整数计算时会出现精度损失,建议用位运算代替。- 二进制字符数组没有手动添加字符串结束符
'\0',输出时会出现乱码。 - 接收十进制输入的变量
dec定义为int类型,和函数要求的unsigned long不匹配,数值范围不足。 - 原
decToBin的数值判断条件逻辑有误,会导致高位计算错误。
修复后完整代码
#include <iostream> #include <cstring> using namespace std; // 仅声明处保留默认参数 void decToBin(unsigned long n, int size, char str[], int i = 0); unsigned long binToDec(char b[], int size, int i = 0); int main() { unsigned long dec; int ch, bits = sizeof(unsigned long) * 8; char bin[bits + 1]; do { dec = 0; memset(bin, '0', bits); bin[bits] = '\0'; // 手动添加字符串结束符 cout << "\n\n\t\tMENU" << endl; cout << "1.Decimal to Binary number" << endl; cout << "2.Binary to Decimal number" << endl; cout << "3.Exit" << endl; cout << "Enter your choice(1/2/3): "; cin >> ch; switch (ch) { case 1: cout << "Enter a Decimal Number: "; cin >> dec; decToBin(dec, bits, bin); cout << dec << " in decimal = " << bin << " in binary" << endl; break; case 2: cout << "Enter a Binary Number: "; cin >> bin; cout << bin << " in binary = " << binToDec(bin, strlen(bin)) << " in decimal" << endl; break; case 3: break; default: cout << "Invalid choice" << endl; } } while (ch != 3); return 0; } // 定义处去掉默认参数 void decToBin(unsigned long n, int size, char str[], int i) { if (i >= size) { return; // 递归终止用return代替break } // 移位运算代替pow避免精度问题 if (n >= (1UL << (size - i - 1))) { str[i] = '1'; n -= (1UL << (size - i - 1)); } else { str[i] = '0'; } decToBin(n, size, str, i + 1); } // 定义处去掉默认参数 unsigned long binToDec(char b[], int size, int i) { if (i >= size) { return 0; } // 移位运算代替pow避免精度问题 return (unsigned long)((b[size - 1 - i] - '0') * (1UL << i) + binToDec(b, size, i + 1)); }
内容的提问来源于stack exchange,提问作者JRBros
相关产品推荐
相关产品推荐

