2009-06-28 9 views
2

Ich schreibe ein einfaches Programm. Es gibt nur eine Klasse darin. Es gibt die Char * -Nummer eines privaten Mitglieds und zwei Funktionen (es wird mehr geben, aber zuerst sollten diese richtig funktionieren :)).Drucken eines Char * in C++

Der erste sollte die 'Quelle' in 'Zahl' Variable (und ich nehme an, irgendwo hier ist das Problem) kopieren:

LongNumber::LongNumber(const char * source){ 
     int digits = strlen(source); 

     char* number = new char[digits+1]; 
     strcpy(number, source); 
     // cout<<number<<endl; - if the line is uncommented, 
     // the output is correct and there isn't a problem 

} 

und eine Druckfunktion:

void LongNumber::print(){ 
    cout<<number<<endl; 
    // when I try to print with the same line of code here..it crashes 
} 

Sicher, Ich vermisse etwas ... aber was?

(Da dies mein erster Beitrag ist ... denken Sie, die Tags sind corrected..how würden Sie den Beitrag getaggt?)

Vielen Dank im Voraus :)

Antwort

5

Im LongNumber Konstruktor Sie eine neue lokale Variable number Namen erklären und es mit einem neuen char Array initialisieren:

char* number = new char[digits+1]; 

Stattdessen sollten Sie die char* auslassen, so dass es nicht wie eine neue Variablendeklaration sieht und verwendet das Objekt Membervariable:

number = new char[digits+1]; 

Mit dem aktuellen Code, die Membervariable number nie initialisiert wird und es später in print Verwendung führt zu einem Fehler.

6

Ihre Zahl char * -Array würde den Gültigkeitsbereich des Konstruktors verlassen. Wenn Sie das print() erreichen, würde das Programm nicht mehr auf den Speicher zugreifen, auf den die * Nummer ursprünglich zeigt, sondern würde abstürzen (d. H. Segmentierungsfehler). Zur Lösung dieses Problems tun Sie stattdessen:

class LongNumber 
{ 
    char *number; 
    LongNumber(const char *source); 
    ~LongNumber(); 
    void print(); 
}; 

LongNumber::LongNumber(const char * source){ 
     int digits = strlen(source); 

     number = new char[digits+1]; 
     strcpy(number, source);  
} 

void LongNumber::print(){ 
    cout<<number<<endl; 
} 

Vergessen Sie nicht, die folgendes zu tun:

LongNumber::~LongNumber() 
{ 
    delete [] number; // to avoid memory leaks 
} 

Ich würde auch empfehlen, mit STL :: string anstatt char * für * Nummer Variable, da Sie sich nicht selbst mit dem Speicherverwaltungsaufwand beschäftigen müssen und das Kopieren der Zeichenfolge auch einfacher wäre.

1

Ihr Problem ist in Ihrem Konstruktor:

LongNumber::LongNumber(const char * source) 
{ 
    ... 
    // you are declaring a new local variable called `number` here 
    char* number = new char[digits+1]; 
    strcpy(number, source); 
    ... 
} 

Sie sind nicht in die Klassenvariable Kopieren genannt number, führen Sie eine neue lokale Variable in dem Körper des Konstruktor deklarieren und verwenden. Die Klassenmitgliedsvariable ist nicht verwendet und wahrscheinlich nicht definiert. Für ein Zeigerelement bedeutet dies, der Wert jeder ungültiger Wert sein könnte - dann, wenn Sie Druck nennen:

void LongNumber::print() 
{ 
    cout<<number<<endl; 
    // when I try to print with the same line of code here..it crashes 
} 

Die number Sie verwenden hier ist die Klassenvariable, die wie gesagt nicht definiert ist. Der Aufruf an cout wird dann abstürzen, da es versucht, diesen ungültigen Zeiger zu verwenden.

Das Update ist der Konstruktor, um die richtige Klassenvariable verwenden:

LongNumber::LongNumber(const char * source) 
{ 
    ... 
    // use the class member variable `number` here 
    number = new char[digits+1]; 
    strcpy(number, source); 
    ... 
} 
1

Es sieht für mich wie Ihre erklärt Nummer als lokale Variable. Wenn Sie es in der Lage sein wollen, in einer anderen Funktion erneut aufrufen, haben Sie es in der Klassendefinition zu erklären ... wie so:

class LongNumber{ 
public: 
     int digits; 
     char* number; 
     LongNumber(const char * source); 
     void print(); 
} 

LongNumber::LongNumber(const char * source){ 
     digits = strlen(source); 
     number = new char[digits+1]; 
     strcpy(number, source); 
     // cout<<number<<endl; - if the line is uncommented, 
     // the output is correct and there isn't a problem 
} 

void LongNumber::print(){ 
    cout<<number<<endl; 
    // when I try to print with the same line of code here..it crashes 
} 

Hoffnung, die hilft !!!

+0

Oops, scheint eine Million Menschen die Frage beantwortet, während ich ... Entschuldigung dafür war :) – micmoo

+0

hängt davon ab, wie viel in die Tiefe Menschen sind sowie andere Vorschläge, die den Code noch einfacher zu verwalten machen könnte – stanigator