将二进制转换为十进制如何要求用户仅输入二进制

时间:2019-12-17 15:58:13

标签: c++

我正在尝试要求用户仅输入二进制数,假设(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] != '\0') {
                    cout << "Only binary numbers are allowed\n";
                    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;
}

2 个答案:

答案 0 :(得分:0)

您已经创建了一个大小为40的输入数组,并将第一个字符设置为一个空格。但是,您永远不会将用户的输入读入该数组!它卡在变量bootstrap.min.css中。结果,binary(检查的第一件事)将始终等于r[0],这将导致您的循环失败。

请考虑以下两项更改:

  • 初始化数组时,请使用空终止符将其填充为:for
  • char r[40] = {};转换为字符串或char数组,然后将其读入binary以检查无效输入。

如果您想完全避免使用字符串,则可以简单地使用取模运算符来验证除0或1之外没有数字。

r

答案 1 :(得分:0)

另一种解决方案是将输入保留为字符串,对其进行验证,然后将其转换为数字,如下所示:

#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 allowed\n";
                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个循环。

这是您想要的。

相关问题