2009-03-09 5 views
1

Ich habe ein altes Programm, in dem einige Bibliotheksfunktion verwendet wird, und ich habe nicht diese Bibliothek.Umwandlung von char ** in char * oder char

Also schreibe ich dieses Programm mit Bibliotheken von C++. In diesem alten Code gibt es eine Funktion, die wie folgt aufgerufen wird

* string = newstrdup ("Einige Zeichenfolge geht hier");

Die String-Variable wird als char ** string deklariert;

Was kann er in dieser Funktion namens "Newstrdup" tun? Ich versuchte viele Dinge, aber ich weiß nicht, was er tut ... Kann jemand helfen

+0

Können Sie die newstrudup() -Funktion einfügen? –

+0

@tinkertim: "Ich habe ein altes Programm, in dem einige Bibliotheksfunktion verwendet wird und ich habe diese Bibliothek nicht" ... –

+0

Kannst du irgendeinen alten Code einfügen, wo newstrudp verwendet wird? Vorzugsweise in einer Schleife. Hast du eine Deklaration für Newstrdup aus einer .h-Datei? – jmucchiello

Antwort

3

Es muss einen Grund geben, dass sie eine "neue" Version von strdup geschrieben haben. Also muss es einen Eckfall geben, den es anders handhabt. Vielleicht gibt eine Null-Zeichenfolge eine leere Zeichenfolge zurück.

Litbs Antwort ist ein Ersatz für strdup, aber ich würde denken, dass es einen Grund gibt, warum sie taten, was sie taten.

Wenn Sie strdup direkt verwenden möchten, verwenden Sie eine Definition, um sie umzubenennen, anstatt neuen Code zu schreiben.

+1

yep, da es "neue" strdup genannt wird, denke ich, es verwendet Operator neu anstelle von malloc (strdup verwendet malloc). Sie können auch aus Gründen der Portabilität ihre eigenen haben. Ich weiß es nicht :) –

+0

Es kann auch newstrudup() genannt werden, weil strdup() nicht Standard ist, obwohl es weit verbreitet ist, und sie wollten klar bleiben. Die Verwendung von 'newstrudp()', um 'straddup-variant-using-new' anzuzeigen, ist ebenfalls plausibel. –

+0

strdup() eingebaute Funktion ist in Ordnung. aber wenn ich die Funktion mit * Antwort = Newstrdup ("einige String") rufe ich bekomme Segmentierung Fehler. Was kann er Grund dafür sein und wie zu überwinden? – Chaithra

0

newstrdup macht wahrscheinlich eine neue Zeichenfolge, die ein Duplikat der übergebenen Zeichenfolge ist; es gibt einen Zeiger auf die Zeichenfolge zurück (die selbst für die Zeichen von Bedeutung ist).

+0

Komisch, warum sollte es nicht einfach einen Zeiger auf die Charaktere zurückgeben? –

+0

@Iraimbilanja: Es scheint so zu sein. – sfossen

0

Es sieht so aus, als ob er eine strdup() -Funktion geschrieben hat, um einen vorhandenen Zeiger zu bearbeiten, wahrscheinlich, um ihn auf eine neue Größe zu verteilen und dann seinen Inhalt zu füllen. Wahrscheinlich macht er dies, um den gleichen Zeiger in einer Schleife wiederzuverwenden, in der sich * string häufig ändert, während ein Leck bei jedem folgenden Aufruf von strdup() verhindert wird.

Ich würde wahrscheinlich implementieren, wie String = redup (& String, "neue Inhalte") .. aber das bin nur ich.

bearbeiten:

Hier ist ein Schnipsel meines ‚redup‘ Funktion, die etwas Ähnliches zu tun könnte, was Sie auf dem Laufenden, nur in einer anderen Art und Weise:

int redup(char **s1, const char *s2) 
{ 
    size_t len, size; 

    if (s2 == NULL) 
     return -1; 

    len = strlen(s2); 
    size = len + 1; 

    *s1 = realloc(*s1, size); 

    if (*s1 == NULL) 
     return -1; 

    memset(*s1, 0, size); 
    memcpy(*s1, s2, len); 

    return len; 
} 

Natürlich sollte ich speichern Sie wahrscheinlich eine Kopie von * s1 und stellen Sie sie wieder her, wenn realloc() fehlschlägt, aber ich musste diesen Paranoiden nicht bekommen.

4

Die Funktion wird verwendet, um eine Kopie von C-Strings zu erstellen. Dies wird oft benötigt, um eine beschreibbare Version eines String-Literals zu erhalten. Sie (String-Literale) sind selbst nicht beschreibbar, daher kopiert eine solche Funktion sie in einen zugewiesenen schreibbaren Puffer. Sie können sie dann an Funktionen übergeben, die ihr übergebenes Argument ändern, wie strtok, das in den String schreibt, den es zu tokenisieren hat.

Ich glaube, Sie mit so etwas wie dies oben kommen kann, da sie genannt wird neue strdup:

char * newstrdup(char const* str) { 
    char *c = new char[std::strlen(str) + 1]; 
    std::strcpy(c, str); 
    return c; 
} 

Du solltest wäre es einmal befreien getan, um die Zeichenfolge mit

delete[] *string; 
mit

Eine alternative Schreibweise ist malloc. Wenn die Bibliothek alt ist, kann es verwendet, dass, die C++ von C geerbt:

char * newstrdup(char const* str) { 
    char *c = (char*) malloc(std::strlen(str) + 1); 
    if(c != NULL) { 
     std::strcpy(c, str); 
    } 
    return c; 
} 

Jetzt sollen Sie die Zeichenfolge frei free mit, wenn Sie fertig:

free(*string); 

Ziehe die erste Version wenn Sie mit C++ schreiben.Wenn der vorhandene Code jedoch free verwendet, um den Speicher wieder freizugeben, verwenden Sie die zweite Version. Beachten Sie, dass die zweite Version NULL zurückgibt, wenn kein Speicher verfügbar ist, um die Zeichenfolge zu kopieren, während die erste in diesem Fall eine Ausnahme auslöst. Wenn Sie ein NULL-Argument an Ihre übergeben, sollte eine weitere Notiz zu Verhalten verwandt werden. Abhängig von Ihrer Bibliothek, die möglicherweise erlaubt oder nicht erlaubt ist. Fügen Sie bei Bedarf entsprechende Überprüfungen in die oben genannten Funktionen ein. In POSIX-Systemen ist eine Funktion strdup verfügbar, die weder NULL Argumente erlaubt, noch den Operator C++ zum Reservieren von Speicher verwendet.

Wie auch immer, ich habe mit Google Codesearch für newstrdup Funktionen gesucht und einige gefunden. Vielleicht ist Ihre Bibliothek unter den Ergebnissen:

Google CodeSearch, newstrdup

+0

Ich habe dein Programm so versucht. ich nannte Newstrdup so. * ersprechse = newstrdup (Puffer) wo Puffer = "Chaithra" aber während der Ausführung gibt es als Segmentierung Fehler. – Chaithra

+0

Chaithra, hast du beide Versionen ausprobiert? –

+0

nein litb ich habe nur die erste Version versucht. Jetzt werde ich einen anderen versuchen. – Chaithra

0

Ich glaube, Sie brauchen, zu betrachten, was mit dem „string“ Variable im Code als Prototyp für die newstrdup() Funktion identisch zu sein scheint, geschieht in der Bibliothek strdup() Version.

Gibt es im Code freie (* string) Aufrufe?

Es scheint eine merkwürdige Sache zu sein, es sei denn, es speichert intern eine Kopie der doppelten Zeichenfolge und gibt einen Zeiger wieder auf die gleiche Zeichenfolge zurück.

Auch ich würde fragen warum?

+0

ya, dachte ich das gleiche, es muss ein Eckfall sein, es ist anders handhaben :) – sfossen

1

Die Linie *string = newstrdup("Some string goes here"); zeigt keine Verrücktheit zu newstrdup. Wenn string den Typ char ** hat, gibt newstrdup gerade char * wie erwartet zurück. Vermutlich wurde string bereits eingestellt, um auf eine Variable vom Typ char * zu zeigen, in der das Ergebnis platziert werden soll. Andernfalls schreibt der Code durch einen nicht initialisierten Zeiger.