c++ - 在抛出 'std::length_error' what(): basic_string::_S_create 实例后终止调用

标签 c++ string stl segmentation-fault

当编译器处于发布版本时,我收到标题中提到的运行时错误,而当它处于调试版本时,出现段错误。我做了一些研究,我发现这是因为我将字符串传递给 add 方法的方式。我不清楚,所以如果有人用简单的语言描述为什么会发生运行时错误,那将会很有帮助。

#include <bits/stdc++.h>
using namespace std;
string add(string a,string b)
{

int lena=a.size()-1,lenb=b.size()-1,carry=0,t;
//segfault occurs here 
string tmp;
int m,n;
while(lena>=0||lenb>=0)
{
    m=0;
    n=0;
    if(lena>=0)
    {
        m=a[lena]-'0';
        lena--;
    }
    if(lenb>=0)
    {
        n=b[lenb]-'0';
        lenb--;
    }
    t=m+n+carry;
    if(t>9)
    {
        carry=1;
    }
    else
    carry=0;
    tmp.push_back('0'+t%10);
}
if(carry)
tmp.push_back('1');
reverse(tmp.begin(),tmp.end());
return tmp;}

class Solution
{
public:
string multiply(string A,string B);
};

string Solution::multiply(string A,string B) {
    int i=A.size()-1,j=0,szb=B.size(),c=0,m=0,k=0,n=0;
    string sum="",tmp="";
    while(i>=0)
    {
        tmp.clear();
        j=szb-1;
        k=n;
        while(k--)
        {
            tmp.push_back('0');
        }
        n++;
        c=0;
        while(j>=0)
        {
            m=(A[i]-'0')*(B[j]-'0')+c;
            c=m/10;
            tmp.push_back((m%10)+'0');
            j--;
        }
        if(c)
        tmp.push_back(c+'0');
        reverse(tmp.begin(),tmp.end());
        sum=add(sum,tmp);
        i--;
    }
    string ans;
    for(i=0,j=sum.size();i<j;i++)
    {
        if(sum[i]!='0')
        {
            while(i<j)
            {
                ans.push_back(sum[i]);
                i++;
            }
        }
    }
    if(ans.size()==0)
    return "0";
}

int main()
{
    Solution ob;
    string  s;
    s=ob.multiply("99999","99999");
    cout<<s<<endl;
}

最佳答案

该错误与您将字符串传递给 add 函数的方式无关。我不确定你从哪里得到这个想法。错误在这里

if(ans.size()==0)
return "0";

应该说

if (ans.size() == 0)
    return "0";
else
    return ans;

问题是如果 ans.size() > 0 那么您没有返回任何东西,但是您的函数 promise 返回一个字符串。这会导致运行时崩溃。

当我在我的编译器上尝试你的代码时,它给了我一个警告

警告 C4715:“Solution::multiply”:并非所有控制路径都返回值

这正是我所说的,您并不总是从multiply 中返回一个值。您的编译器可能会说类似的话,您应该始终注意编译器警告消息。它们通常确实表明您的代码有问题。

关于c++ - 在抛出 'std::length_error' what(): basic_string::_S_create 实例后终止调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32410394/

相关文章:

C++ 段错误追加、push_back 和运算符 = 或 +=

arrays - 将字符串拆分为数组(每个字符)-Swift

c - 当我们尝试在 C 编程中将它用于多个字符串时,为什么 malloc 可以工作而 calloc 不能?

c++ - 我需要在 C++ 中销毁一个字符串吗

c++ - 从 vector 到指针 vector 的最短转换

c++ - 如何使用getc编写getLine函数

c++ - 防止在模板中使用某些类型

c++ - 如何在 C 风格的类声明中使用 NSInteger

c++ - 字母排序是向后使用 string.compare()

C++:如何在非零大小的 map 中初始化 vector