2017-03-04 57 views
-1

所以我创建了一个程序,用字符串总结两个“大整数”(比正常长的长)。问题是,当我运行该程序时,我输入了两个字符串,它甚至输出正确的结果,但随后打开“BigIntegers.exe已停止工作”窗口。当我在控制台的末尾关闭它时,它会显示“进程返回0xC0000005”。使用字符串时C++崩溃

#include<iostream> 
#include<algorithm> 
using namespace std; 

int main(){ 
string a, b; 
string c; 
int save=0; 

cin>>a>>b; 

reverse(a.begin(), a.end()); 
reverse(b.begin(), b.end()); 

int minS=min(a.size(), b.size()); 
int maxS=max(a.size(), b.size()); 

int i; 
bool flag=true; 

for(i=0; i<=maxS; i++){ 
    if(i<minS){ 
     c[i]=(a[i]+b[i]-2*int('0')+save)%10; 
     save=int(a[i]+b[i]-2*int('0')+save)/10; 
    }else if(i>=minS&&i<maxS){ 
     if(a.size()>b.size()){ 
      c[i]=(a[i]+save-int('0'))%10; 
      save=int(a[i]+save-int('0'))/10; 
     } 
     else{ 
      c[i]=(b[i]+save-int('0'))%10; 
      save=int(b[i]+save-int('0'))/10; 
     } 
    }else{ 
     if(save==0) flag=false; 
     else {c[i]=0; c[i]+=save;} 
    } 
} 

if(flag == false){ 
    for(int i=maxS-1; i>=0; i--){ 
     cout<<int(c[i]); 
    } 
}else{ 
    for(int i=maxS; i>=0; i--){ 
     cout<<int(c[i]); 
    } 
} 

return 0; 
} 
+4

解决此类问题的正确工具是您的调试器。在*堆栈溢出问题之前,您应该逐行执行您的代码。如需更多帮助,请阅读[如何调试小程序(由Eric Lippert撰写)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。至少,您应该\编辑您的问题,以包含一个[最小,完整和可验证](http://stackoverflow.com/help/mcve)示例,该示例再现了您的问题,以及您在调试器。 –

+0

你可以(也会!)超出你的字符串范围。请记住,由于数组,矢量和字符串索引都是从零开始的,所以最上面的索引是'size - 1'。你的循环不尊重这一点。 –

+0

对不起,然后。 –

回答

2

Pelease,检查你的问题。错误0xc0000005是关于“内存访问冲突”,这是因为你在许多地方超越了字符串限制。例如,下一个为:

for(i=0; i<=maxS; i++) 

它从0运行到maxS,但您的字符串从0到(maxS - 1)。在你试图读取位置c [maxS]的时刻,你是一个入侵的内存。

+1

谢谢,但是如果两个字符串的长度相等且最后两位数字的总和大于9,那么如何在“c”字符串中再添加一个空格,没有访问无限内存? –

+0

在这种情况下,在输出字符串的开头插入一个额外的字符。你必须处理两个输入字符串可能长度不同的事实。从右向左工作,并逐个增加输出字符串的一个字符。如果您希望获得更高的效率,请勿使用字符串,请使用多个X字节块。例如基于1字节的“long int”基本上是“base 256”数学,所有的逻辑与字符串大小写相同。二的幂的基地也加快了代码很多,因为你不需要%和/,你可以使用位掩码和位移。 –

0

天哪,我发现了错误! 感谢您的帮助,但!

#include<iostream> 
#include<algorithm> 
using namespace std; 

int main(){ 
string a, b; 
string c; 
int save=0; 

cin>>a>>b; 

reverse(a.begin(), a.end()); 
reverse(b.begin(), b.end()); 

int minS=min(a.size(), b.size()); 
int maxS=max(a.size(), b.size()); 

int i; 
bool flag=true; 

for(i=0; i<=maxS; i++){ 
    if(i<minS){ 
     c[i]=(a[i]+b[i]-2*int('0')+save)%10; 
     save=int(a[i]+b[i]-2*int('0')+save)/10; 
    }else if(i>=minS&&i<maxS){ 
     if(a.size()>b.size()){ 
      c[i]=(a[i]+save-int('0'))%10; 
      save=int(a[i]+save-int('0'))/10; 
     } 
     else{ 
      c[i]=(b[i]+save-int('0'))%10; 
      save=int(b[i]+save-int('0'))/10; 
     } 
    }else{ 
     if(save==0) flag=false; 
     else c[i]=1;//<---------Here it is, before it was c[i]=0; c[i]+=save; 
    } 
} 
//cout<<c.size()<<endl; 
if(flag == false){ 
    for(int i=maxS-1; i>=0; i--){ 
     cout<<int(c[i]); 
    } 
}else{ 
    for(int i=maxS; i>=0; i--){ 
     cout<<int(c[i]); 
    } 
} 

return 0; 
}