web-dev-qa-db-de.com

Wie kann ich const char * in string und dann zurück in char * konvertieren?

Ich fange gerade mit C++ an und habe Schwierigkeiten, const char* zu verstehen. Ich versuche, die Eingabe in der Methode in string zu konvertieren, und ändere dann die Zeichenfolgen, um Bindestriche hinzuzufügen, wo ich will, und nehme letztendlich diese Zeichenfolge und konvertiere sie zurück in char*, um zurückzukehren. Wenn ich dies versuche, erhalte ich einen Busfehler 10.

char* getHyphen(const char* input){
    string vowels [12] = {"A","E","I","O","U","Y","a","e","i","o","u","y"};

    //convert char* to string
    string a;
    int i = 0;
    while(input != '\0'){
        a += input[i];
        input++;
        i++;
    }

    //convert a string to char*

    return NULL;
}
6

A: Die Klasse std::string verfügt über einen Konstruktor, der einen char const* verwendet, sodass Sie einfach eine Instanz erstellen, um Ihre Konvertierung durchzuführen.

B: Instanzen von std::string verfügen über eine c_str()-Memberfunktion, die einen char const* zurückgibt, den Sie zum Konvertieren in char const* verwenden können.

auto my_cstr = "Hello";        // A
std::string s(my_cstr);        // A
// ... modify 's' ...
auto back_to_cstr = s.c_str(); // B
13
bku_drytt

Zunächst benötigen Sie nicht den gesamten Code, um aus der Eingabe einen std::string zu erstellen. Sie können einfach verwenden:

string a(input);

Soweit Sie einen neuen char* zurückgeben, können Sie Folgendes verwenden:

return strdup(a.c_str());  // strdup is a non-standard function but it
                           // can be easily implemented if necessary.

Stellen Sie sicher, dass Sie den zurückgegebenen Wert freigeben.

Es ist besser, einfach einen std::string zurückzugeben, damit sich die Benutzer Ihrer Funktion keine Gedanken über die Speicherzuweisung/-freigabe machen müssen.

std::string getHyphen(const char* input){
2
R Sahu

Verwenden Sie nicht char*. Verwenden Sie std::string, wie alle anderen Ihnen dies mitteilen. Dadurch werden alle diese Probleme beseitigt.

Der Vollständigkeit halber und um den Hintergrund zu verstehen, analysieren wir jedoch, was los ist.


while(input != '\0'){

Sie meinen wahrscheinlich:

while(*input != '\0') {

Ihr Code vergleicht den input-Zeiger selbst mit \0, d. H. Er sucht nach einem Nullzeiger, der auf die unglückliche automatische Konvertierung von einem \0char zurückzuführen ist. Wenn Sie versuchen, beispielsweise mit 'x' oder 'a' zu vergleichen, erhalten Sie einen Kompilierungsfehler anstelle von Laufzeitabstürzen.

Sie wollen dereference den Zeiger über *input, um zu der char zu gelangen, auf die verwiesen wird.

a += input[i];
input++;
i++;

Das wird auch nicht funktionieren. Sie erhöhen den input-Zeiger, bewegen sich jedoch mit [i] noch weiter vor. Wenn zum Beispiel input dreimal inkrementiert wurde, ist input[3] das 7. Zeichen des ursprünglichen Arrays, das an die Funktion übergeben wurde, nicht das 4.. Dies führt schließlich zu undefiniertem Verhalten, wenn Sie die Grenzen des Arrays verlassen. Undefiniertes Verhalten kann auch der "Busfehler 10" Sie erwähnen.

Ersetzen mit:

a += *input;
input++;
i++;

(Jetzt, da i nicht mehr verwendet wird, können Sie es komplett entfernen.)


Und lassen Sie mich das noch einmal wiederholen: Verwenden Sie nicht char*. Verwenden Sie std::string.

1
Christian Hackl

Ändern Sie Ihre Funktionserklärung ab

char* getHyphen(const char* input)

zu

auto hyphenated( string const& input )
    -> string

und vermeiden Sie alle Probleme der Konvertierung in char const* und zurück.

Das heißt, Sie können einen std::string aus einem char_const* wie folgt konstruieren:

string( "Blah" )

und Sie erhalten einen temporären char const* zurück, indem Sie die c_str-Methode verwenden.

Beachten Sie, dass das Ergebnis von c_str nur gültig ist, solange die ursprüngliche string-Instanz existiert und nicht geändert wird. Wenn Sie beispielsweise c_str auf eine lokale string anwenden und dieses Ergebnis zurückgeben, erhalten Sie Undefined Behavior und sind keine gute Idee. Wenn Sie unbedingt einen char* oder char const* zurückgeben müssen, weisen Sie ein Array mit new zu und kopieren Sie die Zeichenfolgendaten mit strcpy wie folgt: return strcpy( new char[s.length()+1], s.c_str() ), wobei der +1 ein abschließendes Null-Byte enthalten soll.