2017-03-04 102 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; 
}