<string> to char[] konvertierung



  • Sorry, aber die Suchfunktion ist bei mir gerade 1. extrem langsam, 2. habe ich leider nichts passendes finden können.

    Die Frage erscheint mir eigentlich zu simpel, aber ich bekomme eine Typenkonvertierung eines STL-strings in ein Char-array nicht gebacken.

    string S="blablabla";
    char buffer[128];
    
    sprintf(buffer,"%s", S);       // array bleibt leer
    buffer=static_cast<char>(S);   // error: invalid static_cast from...
    

    Eigenartigerweise akzeptiert eine Funktion, welche einen Zeiger auf ein Array erwartet folgende Referenzübergabe:

    string S="blablabla";
    function(&S[0]);      // Warum??? vor allem nur mit Index 0
    


  • std::string hat eine Funktion c_str() , die einen const char* zurückgibt. Aber du kannst das dem Array nicht einfach so zuweisen, sondern müsstest evtl. std::copy() verwenden oder eine Schleife schreiben.

    P.S.: Du hättest ein bisschen Geduld haben müssen mit der Suche, die Frage taucht oft auf.



  • a) würde gehen mit sprintf(buffer, "%s", myStr.c_str());
    Aber hier darauf achten das buffer groß genug ist.

    b) Ist ja auch richtig. Intern hat string auch ein char-array. Und mit &s[0] hast du ein normales c-Array. Im Grunde das gleiche wie c_str(). Außer das es dann const ist.



  • Fellhuhn schrieb:

    b) Ist ja auch richtig. Intern hat string auch ein char-array. Und mit &s[0] hast du ein normales c-Array. Im Grunde das gleiche wie c_str(). Außer das es dann const ist.

    Da wär ich mir jetzt nicht so sicher, ob das bei jeder Implementation so ist. Zumindest würde ich nicht davon ausgehen; ich meinte, std::string wäre im Gegensatz zu std::vector , der intern immer ein Array hat, nicht unbedingt C-kompatibel.



  • Danke schön



  • Nexus schrieb:

    Da wär ich mir jetzt nicht so sicher, ob das bei jeder Implementation so ist. Zumindest würde ich nicht davon ausgehen;

    Das war mein Gedanke, unsicherheit, obwohl es funktioniert. ausserdem sieht &S[0] auf den ersten Blick verwirrend und unleserlich aus



  • Nexus schrieb:

    Fellhuhn schrieb:

    b) Ist ja auch richtig. Intern hat string auch ein char-array. Und mit &s[0] hast du ein normales c-Array. Im Grunde das gleiche wie c_str(). Außer das es dann const ist.

    Da wär ich mir jetzt nicht so sicher, ob das bei jeder Implementation so ist. Zumindest würde ich nicht davon ausgehen; ich meinte, std::string wäre im Gegensatz zu std::vector , der intern immer ein Array hat, nicht unbedingt C-kompatibel.

    Jap. ist auch so. &s[0] von einem std::string s wie einen C-String zu benutzen, produziert undefiniertes Verhalten. s.c_str() muss nicht unbedingt der internen Repräsentation entsprechen.



  • Sorry, aber die Suchfunktion ist bei mir gerade 1. extrem langsam

    Ja. Das nervt mich hier auch. Kleiner Tipp: Versuchs über google. Da findet sich meistens auch was aus diesem Forum. Ist einfacher, als die Suchfunktion hier.



  • zu a) sprintf ist eine C-Funktion und hat aus verschiedenen Gründen in C++ nichts zu suchen (Längenchecks, Typsicherheit etc.)

    Wenn du den char-array readonly benutzen möchtest reicht ein einfaches

    string S = "blablabla";
    function(S.c_str());
    

    (wurde ja auch schon gesagt)

    Wenn du es beschreibbar haben möchtest kommst du um eine Kopie nicht herum, allerdings dann bitte sicher (und auch wieder mit C++-Funktionen):

    std::string S = "blablabla";
    static std::size_t const buflen = 1024;
    char buf[buflen] = {0};
    std::copy(S.c_str(), S.c_str() + std::max(S.length(), buflen), buf);
    
    function(buf);
    

    alternativ mit einem dynamischen Array, damit die Länge nicht auf einen festen Wert beschränkt ist:

    std::string S = "blablabla";
    std::size_t buflen = S.length();
    char* buf = new char[buflen];
    std::copy(S.c_str(), S.c_str()+buflen, buf);
    
    function(buf);
    //...
    delete buf; //nicht vergessen...
    

Anmelden zum Antworten