2016-04-03 4 views
-2

Ich habe eine Funktion, die const char* zurückgeben. In dieser Funktion habe ich folgende params:cpp-wie bekomme ich nur den Wert von c_str()

string str; 

Für str const char* Umwandlung I str.c_str() verwenden.

Beim Debuggen merke ich, dass str.c_str() etwas enthält (ich denke seine Adresse) vor dem Wert der Zeichenfolge. Zum Beispiel: Wenn str = "0" I str.c_str() wiil 0x68d5f9 "0". Warum ist es? Wie kann ich nur den Wert der Zeichenfolge erhalten?

+0

Sie sind falsch, die Debugger Ausgabe zu lesen. Es druckt die Adresse, auf die der Zeiger zeigt, und zeigt dann die spitze Zeichenfolge "0" an. – erenon

+1

es ist eine Funktion, rufen Sie 'str.c_str()' –

+0

@ erenon- das genau was ich gesagt habe. Ich möchte die Adresse ignorieren, auf die der Zeiger – sara8

Antwort

0

Die Adresse, auf die der Zeiger in der von c_str zurückgegebenen Zeichenfolge verweist, wird nicht angezeigt. Es ist ein Debugger-Artefakt, mit dem Programmierer die Adresse zusammen mit dem Wert überprüfen können.

Allerdings kann das Ergebnis von c_str undefiniertes Verhalten zurückgegeben werden, wenn der Aufruf in einer Funktionsbereichs-Zeichenfolge erfolgt.

Zum Beispiel, das ist illegal:

const char *illegal_return() { 
    string s = "quick brown fox"; 
    return s.c_str(); // <<== Return of c_str from a local string 
} 

Die beste Lösung ist ein string zurückzukehren. Wenn Sie stattdessen einen char Zeiger zurückkehren möchten, müssen Sie eine Kopie machen:

char *legal_return() { 
    string s = "quick brown fox"; 
    const char *ptr = s.c_str(); 
    size_t len = strlen(ptr); 
    char *res = new char[len+1]; 
    strcpy(res, ptr); 
    return res; 
} 

Der Anrufer der obigen Funktion muss delete[] auf das Ergebnis rufen Speicherlecks zu vermeiden.

1

Diese ist nicht ein Problem, das ist, wie Zeiger funktionieren.

Pointers Punkt auf Daten bei einig Speicheradresse enthalten ist, und der Debugger zeigt Ihnen, dass diese Punkte Zeiger 0x<something> und der Wert an dieser Adresse zu adressieren ist '0'. Nichts Seltsames hier.

Wenn Sie diesen Wert von str.c_str() drucken, erhalten Sie eine normale C-Zeichenfolge.

cout << str.c_str(); 

Dies gibt Ihnen die gleichen wie cout << str;

Verwandte Themen