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

C++ Adding binary numbers - Segmentation fault

本文关键字:分段 错误 二进制数 添加 C++      更新时间:2023-10-16

我正在做作业,我必须添加两个二进制数。我有一些代码,它真的不是最好的解决方案,但它有效,至少在 Visual Studio 控制台中,但是,当我上传源代码时.cpp可以判断它是否正常,它给了我错误: 分段故障/总线错误/超出内存限制/超出堆栈限制

在我添加了这部分代码以在结果之前删除"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;
}

谢谢你的帮助。

你在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或其他东西。

可能还有更多的bug,没看得太难。

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