String variable in char array umwandeln



  • Hi,

    ich habe einen an eine Funktion übergebenen String.
    Diese will ich nun in einen char array umwandeln.
    Ich bin am rumprobieren aber es geht nicht.
    Auch nicht

    char array[] = var
    

    oder

    char array[var.length];
    strcpy(array, var);
    

    lG Maltasar



  • Willst du Schreibend zugreifen oder nur lesen?
    Strings haben die c_str() Methode welche einen Zeiger auf einen Char Array zurückgeben. Ggf hilft das schon. Ansonsten musste du ggf den inhalt aus diesen Chararray in einen lokalen kopieren.



  • Hi,

    hinter dem Begriff "umwandeln" steckt die falsche Vorstellung.
    Du möchtest
    - ein char-Array anlegen,
    - ... dessen einzelne chars mit den Werten der entsprechenden String-Chars befüllt sind.

    und genau so sollte es auch laufen:

    #include <string>
    #include <vector>
    #include <algorithm>
    
    using namespace std;
    
    int main()
    {
       string const var = "Mein String";
       char * array = new char[var.size()];
    
       copy(var.begin(), var.end() , array);
    // .... array verwenden
    
       delete[] array; // aufräumen!!
    

    es gibt noch 2 bessere Varianten für bestimmte Fälle:
    a) Selbst aufräumen wird unnötig mit vector

    #include <string>
    #include <vector>
    #include <algorithm>
    
    using namespace std;
    
    int main()
    {
       string const var = "Mein String";
       vector<char> array(var.size());
    
       copy(var.begin(), var.end() , array.begin() );
    
       // .... array verwenden; &array[0] gibt den char-Pointer
    
       // aufräumen macht vector selbst
       return 0;
    }
    

    vector hat auch noch den Vorteil, dass man ihn noch nach der Erstellung vergrößern kann (macht Neuanlage, Kopieren und Aufräumen selbst).

    b) wenn ein const char schon reicht (sprich: Nur gelesen wird), kann man direkt var.c_str() übergeben...

    Gruß,

    Simon2.



  • Bei Variante 1 fehlt beim Array die 0 am Ende.



  • Und wenn der String nicht nullterminiert sein muss:

    std::string foo("bar");
    char* foobar = &foo[0];
    

    Deutlich performanter als die Rumkopiererei.



  • Simon2 schrieb:

    a) Selbst aufräumen wird unnötig mit vector

    string const var = "Mein String";
       vector<char> array(var.size());
       copy(var.begin(), var.end() , array.begin() );
    

    Das geht auch ohne std::copy:

    string const var = "Mein String";
       vector<char> array ( var.begin(), var.end() );
    

    Man beachte aber, dass es hier keine Nullterminierung gibt.

    Icematix schrieb:

    Und wenn der String nicht nullterminiert sein muss:

    std::string foo("bar");
    char* foobar = &foo[0];
    

    Deutlich performanter als die Rumkopiererei.

    Da sollte man die Finger von lassen. Soweit ich weiß, macht std::string keine Garantie über das Speicherlayout der einzelnen Zeichen. Du nimmst hier an, dass sie hintereinander im Speicher stehen. Bei std::vector ist das auch so. Aber bei std::string meines Wissens nicht -- also nicht garantiert, meine ich. Ich lasse mich aber gerne belehren: Zitiere bitte den C++ Standard.

    kk



  • krümelkacker schrieb:

    Simon2 schrieb:

    a) Selbst aufräumen wird unnötig mit vector

    string const var = "Mein String";
       vector<char> array(var.size());
       copy(var.begin(), var.end() , array.begin() );
    

    Das geht auch ohne std::copy:

    string const var = "Mein String";
       vector<char> array ( var.begin(), var.end() );
    

    Man beachte aber, dass es hier keine Nullterminierung gibt.

    Icematix schrieb:

    Und wenn der String nicht nullterminiert sein muss:

    std::string foo("bar");
    char* foobar = &foo[0];
    

    Deutlich performanter als die Rumkopiererei.

    Da sollte man die Finger von lassen. Soweit ich weiß, macht std::string keine Garantie über das Speicherlayout der einzelnen Zeichen. Du nimmst hier an, dass sie hintereinander im Speicher stehen. Bei std::vector ist das auch so. Aber bei std::string meines Wissens nicht -- also nicht garantiert, meine ich. Ich lasse mich aber gerne belehren: Zitiere bitte den C++ Standard.

    kk

    Soweit ich informiert bin, ist es exakt so, wie du beschrieben hast: Es gibt keine Garantie, dass die Zeichen nacheinander abgelegt werden (obwohl das sinnvollerweise oft so realisiert wird).



  • Icematix schrieb:

    std::string foo("bar");
    char* foobar = &foo[0];
    

    Deutlich performanter als die Rumkopiererei.

    Jetzt geht das wieder los 😃
    Alles zum Thema:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-266965.html



  • Braunstein schrieb:

    Bei Variante 1 fehlt beim Array die 0 am Ende.

    Stimmt - hatte ich kurzzeitig bedacht ... und dann doch vergessen. 🙄
    Gut, dass Du nochmal darauf hingewiesen hast 👍
    Bei Variante 2 aber auch nicht, oder?

    krümelkacker schrieb:

    ...
    Das geht auch ohne std::copy:

    string const var = "Mein String";
       vector<char> array ( var.begin(), var.end() );
    

    ...

    Die hatte ich mal weggelassen, um Verwirrungen vorzubeugen...

    Gruß,

    Simon2.



  • brotbernd schrieb:

    Alles zum Thema:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-266965.html

    Danke für den Link. Bitte dort weiterdiskutieren, ich mach hier dann mal dich dass es nicht 20 Threads zum selben Thema gibt 😉


Anmelden zum Antworten