2017-03-04 18 views
-1

Also habe ich ein Programm erstellt, um zwei "Big Integers" (größer als eine normale lange lang) mit Strings zu summieren. Das Problem ist, dass, wenn ich das Programm ausführe, ich die zwei Zeichenfolgen eingeben, es gibt sogar das korrekte Ergebnis aus, aber öffnet dann das Fenster "BigIntegers.exe funktioniert nicht mehr". Wenn ich es am Ende der Konsole schließe, heißt es "Process returned 0xC0000005".C++ Absturz bei der Verwendung von Strings

#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

Das richtige Werkzeug, um solche Probleme zu lösen, ist Ihr Debugger. Sie sollten Schritt für Schritt durch Ihren Code * gehen, bevor Sie auf Stack Overflow nachfragen. Für weitere Hilfe lesen Sie bitte [Wie kleine Programme zu debuggen (von Eric Lippert)] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/). Zumindest sollten Sie Ihre Frage bearbeiten, um ein [minimales, vollständiges und verifizierbares] (http://stackoverflow.com/help/mcve) Beispiel einzufügen, das Ihr Problem zusammen mit den Beobachtungen, die Sie in der Debugger. –

+0

Sie können (und werden!) Außerhalb der Grenzen in Ihren Strings gehen. Denken Sie daran, dass Array-, Vektor- und String-Indizes nullbasiert sind, da der oberste Index "size-1" ist. Deine Schleife respektiert das nicht. –

+0

Sorry für die Frage dann. –

Antwort

2

Bitte, überprüfen Sie Ihre Frage. Der Fehler 0xc0000005 bezieht sich auf "Speicherzugriffsverletzung" und liegt daran, dass Sie die Zeichenfolgenlimits an vielen Stellen überschreiten. Zum Beispiel ist die nächste für:

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

Es läuft von 0 bis MAXS, aber die Zeichenfolge gehen von 0 bis (MAXS - 1). In dem Moment, in dem du versuchst, die Position c [maxS] zu lesen, bist du eine eindringende Erinnerung.

+1

Danke, aber wie würde ich ein weiteres Leerzeichen in der "c" Zeichenfolge hinzufügen, wenn die beiden Strings gleich lang sind und die Summe der letzten zwei Ziffern größer als neun ist, ohne Zugriff auf den Speicher? –

+0

fügen Sie in diesem Fall ein zusätzliches Zeichen am Anfang der Ausgabezeichenfolge ein. Sie müssen damit umgehen, dass die beiden Input-Strings ohnehin unterschiedlich lang sein könnten. Arbeiten Sie von rechts nach links und vergrößern Sie die Ausgabezeichenfolge um jeweils ein Zeichen. Wenn Sie eine höhere Effizienz wünschen, verwenden Sie keine Strings, sondern mehrere Chunks mit X Bytes. z.B. Ein 1-Byte-basiertes "long int" ist im Grunde "base 256" -Mathe, und die gesamte Logik ist die gleiche wie der String-Fall. Basen mit einer Zweierpotenz beschleunigen auch den Code sehr, da Sie% und/nicht brauchen, können Sie Bitmasken und Bitshifting verwenden. –

0

Meine Güte, ich habe den Fehler gefunden! Danke für die Hilfe, obwohl!

#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; 
} 
Verwandte Themen