C ++添加二进制数 - 分段错误

时间:2017-10-31 23:30:52

标签: c++ binary

我在做作业,我必须添加两个二进制数字。我有一些代码,它真的不是最好的解决方案,但它在视觉工作室控制台中至少可以工作,但是,当我将source.cpp上传到一个可以判断它是否可以的webapp时,它会给我一个错误:  分段错误/总线错误/超出内存限制/超出堆栈限制

在我添加了这部分代码后,在结果前删除了“0”,它开始出现了:

int result_int = stoi(result);
if (result_int == 0) // needed for case when result will be only 0, like "00000"
{
    result = '0';
}
else 
{
    int i = 0;
    while (result[i] == '0')
    {
        i++;
    }
    result.erase(0, result.find_first_not_of('0'));
}

有什么不对,可能会导致此错误吗?

这是整个代码(不幸的是,名称是捷克语)

#include <iostream>
#include <string>
using namespace std;
bool IsOneOrZero(string n1, string n2)
{
    bool is_zero;
    for (int i = 0; i < n1.size(); i++)
    {
        if (n1[i] == '1' || n1[i] == '0')
        {
            is_zero = true;
        }
        else
        {
            is_zero = false;
            return is_zero;
        }
    }
    for (int i = 0; i < n2.size(); i++)
    {
        if (n2[i] == '1' || n2[i] == '0')
        {
            is_zero = true;
        }
        else
        {
            is_zero = false;
            return is_zero;
        }
    }
    return is_zero;
}
void ZmenaVelikosti(string& n1, string& n2)
{
    if (n2.size() > n1.size())
    {
        while (n1.size() != n2.size())
        {
            n1 = '0' + n1;
        }
    }
    else if (n1.size() > n2.size())
    {
        while (n1.size() != n2.size())
        {
            n2 = '0' + n2;
        }
    }
}
string SecteniCisel(string n1, string n2)
{
    string vysledek;
    int value = 0;
    for (int i = n1.size(); i >= 0; i--)
    {
        if (n1[i] == '0' && n2[i] == '0' && value == 0)
        {
            vysledek = '0' + vysledek;
            value = 0;
            //soucet prvku je 0
        }
        else if (n1[i] == '0' && n2[i] == '0' && value == 1)
        {
            vysledek = '1' + vysledek;
            value = 0;
            //soucet prvku je 1
        }
        else if (n1[i] == '1' && n2[i] == '0' && value == 0)
        {
            vysledek = '1' + vysledek;
            //soucet prvku je 1
        }
        else if (n1[i] == '0' && n2[i] == '1' && value == 0)
        {
            vysledek = '1' + vysledek;
            //soucet prvku je 1
        }
        else if (n1[i] == '1' && n2[i] == '0' && value == 1)
        {
            vysledek = '0' + vysledek;
            value = 1;
            //soucet prvku je 0
            //value = 1
        }
        else if (n1[i] == '0' && n2[i] == '1' && value == 1)
        {
            vysledek = '0' + vysledek;
            value = 1;
            //soucet prvku je 0
            //value = 1
        }
        else if (n1[i] == '1' && n2[i] == '1' && value == 0)
        {
            vysledek = '0' + vysledek;
            value = 1;
            //soucet prvku je 0
            //value = 1
        }
        else if (n1[i] == '1' && n2[i] == '1' && value == 1)
        {
            vysledek = '1' + vysledek;
            value = 1;
            //soucet prvku je 1
            //value = 1
        }
    }
    if (value == 1)
    {
        vysledek = '1' + vysledek;
    }
    int vysledek_int = stoi(vysledek);
    if (vysledek_int == 0)
    {
        vysledek = "0";
    }
    else 
    {
        int i = 0;
        while (vysledek[i] == '0')
        {
            i++;
        }
        vysledek.erase(0, vysledek.find_first_not_of('0'));
    }
    return vysledek;
}
int main()
{
    string n1;
    string n2;
    cout << "Zadejte dve binarni cisla:" << endl;
    cin >> n1;
    cin >> n2;
    ZmenaVelikosti(n1, n2);
    if (IsOneOrZero(n1, n2) == true)
    {
        cout << "Soucet: " << SecteniCisel(n1, n2) << endl;
    }
    else
    {
        cout << "Nespravny vstup." << endl;
        return 0;
    }
    return 0;
}

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

SecteniCisel中的循环错误:

for (int i = n1.size(); i >= 0; i--)
{
    if (n1[i] == '0' && n2[i] == '0' && value == 0)

n1[i]i时,您正在查看n1.size()。你需要从头开始 n1.size() - 1。在n1.size()访问它无效。

除此之外,所有这些if ... else if ... else if都是真的 可怕。使用表格或switch或其他内容。

可能有更多的错误,看起来不太难。

答案 1 :(得分:0)

你不能使用stoi()方法将字符串转换为整数,因为整数变量可以是最大值2147483647.如果你在字符串变量中加入更大的数字,变量就会溢出。