我试图要求用户只输入二进制数,比如说(11110(,即十进制(30( 但输出总是这样 输入二进制数:11110 - 只允许二进制数 - 答案是:30 我也被要求不要使用任何库或函数。
#include<iostream>
using namespace std;
int main()
{
long int binary, decimal = 0, j, base = 1;
cout << " enter a binary number : ";
cin >> binary;
char r[40] = { " " }; int s[40];
for (int i = 0; i < 40; i++)
{
if (r[i] != '0') {
if (r[i] != '1') {
if (r[i] != ' ') {
cout << "Only binary numbers are allowedn";
break;
}
}
}
}
for (int i = 0; i < 40; i++)
{
if (r[i] == '0')
s[i] = 0;
if (r[i] == '1')
s[i] = 1;
}
while (binary != 0)
{
j = binary % 10;
decimal += j * base;
base *= 2;
binary /= 10;
}
cout <<" the answerr is : "<< decimal << endl;
return 0;
}
您已经创建了一个大小为 40 的输入数组,并将第一个字符设置为空格。但是,您永远不会将用户的输入读入该数组!它卡在变量binary
.结果,r[0]
(检查的第一件事(将始终相等,这将导致您的
char r[40] = {};
循环失败。
请考虑以下 2 个更改:
- 初始化数组时,用空终止符填充它,如下所示:
binary
- 将
r
转换为字符串或字符数组,并将其读入CC_7以检查无效输入。
如果要完全避免字符串,只需使用取模运算符来验证除了 0 或 1 之外没有数字。
long int temp = binary;
while(temp > 0) {
if(temp % 10 > 1) {
std::cout << "Input can only be binary!" << std::endl;
//do something
}
temp = temp / 10; //integer math will cut the lsb
}
另一种解决方案是将输入保留为字符串,对其进行验证,然后将其转换为数字,如下所示:
#include <iostream>
#include <string>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
bool result = false;
long int decimal = 0;
while (!result)
{
string binary;
cout << " enter a binary number : ";
cin >> binary;
bool success = true;
for (int i = 0; i < binary.length(); ++i)
if (binary[i] != '0' && binary[i] != '1')
{
cout << "Only binary numbers are allowedn";
success = false;
break;
}
if (!success)
continue;
long int binNb, j, base = 1;
binNb = atoi(binary.c_str());
while (binNb)
{
j = binNb % 10;
decimal += j * base;
base *= 2;
binNb /= 10;
}
result = true;
}
cout <<" the answer is : "<< decimal << endl;
return 0;
}
但确实,尽管它显示了比 Nick Reed 答案更清晰的代码,但此解决方案的效率可能稍低,因为它需要 2 个循环而不是 1 个循环。
这是你喜欢的。