为什么函数调用直接进入return语句?
Why does function call go directly to return statement?
我是 初学者。我写了一个函数来乘以大整数。当函数 multiplybig(string a,string b)
被调用时,它直接进入同一函数的 return 语句。我不知道错误到底在哪里。有人可以帮我解决这个问题吗?
#include<iostream>
#include<string>
using namespace std;
string multiplybig(string a,string b)
{
string c;
int ar1[a.length()] , ar2[b.length()] ; int ans[a.length()+b.length()]={0};
for(int i=0 ; i<a.length(); i++){
ar1[i]=a[i]-'0';
}
for(int i = 0 ; i<a.length(); i++){
ar2[i]=b[i]-'0';
}
int x = 0 ; int y = 0;
for(int i=a.length()-1;i>=0;i--) {
for(int j=b.length()-1;j>=0;j--){
ans[x]+=ar1[i]*ar2[j];
x++;
}
y++; x=y;
}
for(int i=0,j=a.length()+b.length()-1;i<a.length()+b.length();i++,j--){
c[i]=ans[j]+'0';
}
return c;
}
int main()
{
string a( "123" );
string b( "111" );
cout<< multiplybig( a, b );
return 0;
}
总结评论:
不要使用 VLA
int ar1[a.length()] , ar2[b.length()] ; int ans[a.length()+b.length()]={0};
是VLAa。这些是 not part of the standard,但是编译器特定的扩展。正确的方法是使用 std::vector
:
std::vector<int> ar1(a.length());
std::vector<int> ar2(b.length());
std::vector<int> ans(a.length() + b.length());
(每行一个语句以提高可读性)
循环中的错字
for(int i = 0 ; i<a.length(); i++){
ar2[i]=b[i]-'0';
}
由于您从 b
读取,条件必须是 i < b.length();
c[i]
上的越界访问
行前
c[i]=ans[j]+'0';
c
get 从未分配任何东西(它是一个空字符串),因此使用下标运算符的任何访问都是越界访问。要么先调整它的大小:
c.resize(ans.size());
或使用 push_back
代替:
c.push_back(ans[j]+'0');
您已在上次编辑中修复的最后一个错误(返回值被忽略)。通过所有这些更改,我得到了预期的结果
013653
我是 初学者。我写了一个函数来乘以大整数。当函数 multiplybig(string a,string b)
被调用时,它直接进入同一函数的 return 语句。我不知道错误到底在哪里。有人可以帮我解决这个问题吗?
#include<iostream>
#include<string>
using namespace std;
string multiplybig(string a,string b)
{
string c;
int ar1[a.length()] , ar2[b.length()] ; int ans[a.length()+b.length()]={0};
for(int i=0 ; i<a.length(); i++){
ar1[i]=a[i]-'0';
}
for(int i = 0 ; i<a.length(); i++){
ar2[i]=b[i]-'0';
}
int x = 0 ; int y = 0;
for(int i=a.length()-1;i>=0;i--) {
for(int j=b.length()-1;j>=0;j--){
ans[x]+=ar1[i]*ar2[j];
x++;
}
y++; x=y;
}
for(int i=0,j=a.length()+b.length()-1;i<a.length()+b.length();i++,j--){
c[i]=ans[j]+'0';
}
return c;
}
int main()
{
string a( "123" );
string b( "111" );
cout<< multiplybig( a, b );
return 0;
}
总结评论:
不要使用 VLA
int ar1[a.length()] , ar2[b.length()] ; int ans[a.length()+b.length()]={0};
是VLAa。这些是 not part of the standard,但是编译器特定的扩展。正确的方法是使用 std::vector
:
std::vector<int> ar1(a.length());
std::vector<int> ar2(b.length());
std::vector<int> ans(a.length() + b.length());
(每行一个语句以提高可读性)
循环中的错字
for(int i = 0 ; i<a.length(); i++){
ar2[i]=b[i]-'0';
}
由于您从 b
读取,条件必须是 i < b.length();
c[i]
上的越界访问
行前
c[i]=ans[j]+'0';
c
get 从未分配任何东西(它是一个空字符串),因此使用下标运算符的任何访问都是越界访问。要么先调整它的大小:
c.resize(ans.size());
或使用 push_back
代替:
c.push_back(ans[j]+'0');
您已在上次编辑中修复的最后一个错误(返回值被忽略)。通过所有这些更改,我得到了预期的结果
013653