当编译器处于发行版本时,我在标题中提到了运行时错误,而当它处于调试版本时,我遇到了段错误。我做了一些研究,我发现它是因为我传递字符串添加方法的方式。我不清楚,如果有人用简单的话来描述为什么会发生运行时错误,那将会很有帮助。
#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;
}
答案 0 :(得分:2)
该错误与将字符串传递给add函数的方式无关。我不确定你的想法在哪里。错误在这里
if(ans.size()==0)
return "0";
应该说
if (ans.size() == 0)
return "0";
else
return ans;
问题是,如果ans.size() > 0
那么你没有返回任何东西,但你的函数承诺返回一个字符串。这会导致运行时崩溃。
当我在编译器上尝试代码时,它给了我一个警告
警告C4715:&#39;解决方案::乘以&#39; :并非所有控制路径都返回值
这正是我所说的,你不总是从multiply
返回一个值。您的编译器可能会说类似的东西,您应该始终注意编译器警告消息。他们通常会表明你的代码出了问题。