C++如何检查0-15范围变量并转4位二进制,同时校验输入合法性
错误代码问题排查
你编写的代码存在几个核心语法和逻辑错误:
- if 语句的判断条件必须用圆括号包裹,且等值判断需要用双等号
==,你代码中的单等号=是赋值操作,会直接修改num的值,完全无法完成判断逻辑 - 每个if后额外加了分号,导致if的判断逻辑和后续的cout输出完全解绑,不管条件是否成立都会执行输出
- 无意义的嵌套结构,所有判断属于平级分支,完全不需要嵌套
- 缺失输入校验逻辑,无法处理非数字输入、超范围数值的情况
最优实现方案(直接转4位二进制)
不需要写多条件匹配,直接通过位运算或C++标准库能力转换即可,同时附带完整输入校验逻辑,代码如下:
#include <iostream> #include <bitset> #include <limits> using namespace std; int main() { int num = 0; cout << "Number to check:"; cin >> num; // 输入校验:判断是否为合法整数 if (cin.fail()) { cout << "错误:输入包含非法字符,请输入0-15之间的整数" << endl; // 清空错误状态和输入缓冲区 cin.clear(); cin.ignore(numeric_limits<streamsize>::max(), '\n'); return 1; } // 校验数值范围 if (num < 0 || num > 15) { cout << "错误:输入数值超出范围,请输入0-15之间的整数" << endl; return 1; } // 直接输出4位二进制,自动补前导零 cout << bitset<4>(num) << endl; return 0; }
如果你不想用bitset标准库,也可以手动通过位运算输出每一位:
// 替换上述bitset输出部分即可 for (int i = 3; i >= 0; --i) { cout << ((num >> i) & 1); } cout << endl;
多条件匹配的正确写法(不推荐,仅作示例)
如果一定要用分支匹配实现,用switch语句更清晰,不需要嵌套:
// 输入校验部分和上面一致,校验通过后执行下面的分支 switch(num) { case 0: cout << "0000"; break; case 1: cout << "0001"; break; case 2: cout << "0010"; break; case 3: cout << "0011"; break; case 4: cout << "0100"; break; case 5: cout << "0101"; break; case 6: cout << "0110"; break; case 7: cout << "0111"; break; case 8: cout << "1000"; break; case 9: cout << "1001"; break; case 10: cout << "1010"; break; case 11: cout << "1011"; break; case 12: cout << "1100"; break; case 13: cout << "1101"; break; case 14: cout << "1110"; break; case 15: cout << "1111"; break; }
内容的提问来源于stack exchange,提问作者SlothGamer
相关产品推荐
相关产品推荐

