String2CharArray für C++?



  • Hallo...

    Schon fast den ganzen Tag suche ich nach einer Möglichkeit, einen String in ein char-Array umzuwandeln... Ich zeig euch schnell meinen Code:

    libs:
    
    #include <cstdlib>
    #include <iostream>
    #include <string>
    #include <cstdio>
    
    //funktion, um dies geht
    
    void slowOutput(string str1)
    {
         char text[] = str1; //auch str1.c_str() funzt nicht
    
         int i = 0;
    
             while(i<str1.size())
                 {
                  cout<<text[i];
                  ++i;
                  sleep(280);
                 }
    } //The matrix has you ...
    

    Mein Dev-C++ gibt mir für die Zeile mit char text[] etc. immer aus:

    File.cpp initializer fails to determine size of `text'
    File.cpp invalid initializer

    Als ich das sah, hab ich gegoogelt, und öfters den Tip mit str.c_str() gefunden, welcher bei mir aber anscheinend nicht funktioniert.

    Wäre nett, wenn mir jemand helfen könnte. Schade, dasses bei c++ kein toArray() wie bei Java gibt 😞 ^^

    Wenn die Lösung auf der Hand liegt, bitte ich um Nachsicht, hab vor 4 Tagen erst mit c++ angefangen 😉

    mfg



  • Du meinst sowas wie std::string.c_str() ?



  • in deinem Fall brauchst du das gar nicht. du kannst nämlich auch bei einem String über den [] auf die einzelnen zeichen zugreifen. also strl[i].
    :xmas1:



  • kopfgeldjaeger schrieb:

    einen String in ein char-Array umzuwandeln...

    Willst du den C-String nur ausgeben bzw. weiterreichen, oder auch wirklich verändern?
    Falls ersteres:

    std::string str("Hallo");
    const char *c = str.c_str();
    

    Beachte aber, dass du hier nicht an c rumfummeln darfst, da c wirklich auf den C-String zeigt, der zu str gehört und den du deshalb NICHT verändern solltest.

    Falls zweiters, gehst du hin und kopierst den String rein:

    #include <string>
    #include <cstring>
    
    std::string str("Hallo");
    size_t len = str.size();
    
    char *c = new char[len+1];  //+1 für das '\0'
    
    strncpy(c, str.c_str(), len);
    
    //... Sachen mit c machen...
    
    delete [] c;
    

    hab's jetzt nicht durch den Compiler gejagt, sollte aber gehen.

    MfG

    GPC



  • Toll! Danke @cappo, hätte ich jetzt nicht gedacht 🙂 🙂

    @gpc: danke für die ausführliche erklärung 🙂

    p.s.:
    Das ist ja extrem schnell hier 😮 Sowas bin ich gar nicht gewohnt 😃

    mfg



  • Ergänzungen:

    GPC schrieb:

    kopfgeldjaeger schrieb:

    einen String in ein char-Array umzuwandeln...

    Willst du den C-String nur ausgeben bzw. weiterreichen, oder auch wirklich verändern?
    Falls ersteres:

    std::string str("Hallo");
    const char *c = str.c_str();
    

    Beachte aber, dass du hier nicht an c rumfummeln darfst, da c wirklich auf den C-String zeigt, der zu str gehört und den du deshalb NICHT verändern solltest.

    Und daß bei einem der nächsten Direktaufrufe von string-Methoden dein Zeiger ungültig werden kann.

    Falls zweiters, gehst du hin und kopierst den String rein:

    #include <string>
    #include <cstring>
    
    std::string str("Hallo");
    size_t len = str.size();
    
    char *c = new char[len+1];  //+1 für das '\0'
    
    strncpy(c, str.c_str(), len);
    
    //... Sachen mit c machen...
    
    delete [] c;
    

    Warum über strncpy()? std::string bietet sogar eine eigene Methode copy() dafür an.



  • CStoll schrieb:

    ...Warum über strncpy()? std::string bietet sogar eine eigene Methode copy() dafür an.

    Oha, das wusste ich auch noch nicht ... peinlich.
    🙄

    Gruß,

    Simon2.



  • std::string str("Hallo");
    std::vector<char> chararray(str.begin(), str.end());
    


  • Simon2 schrieb:

    CStoll schrieb:

    ...Warum über strncpy()? std::string bietet sogar eine eigene Methode copy() dafür an.

    Oha, das wusste ich auch noch nicht ... peinlich.
    🙄

    Ich auch nicht. Ist aber auch egal, da es die Lösung in dem Sinn nicht wirklich verbessert.
    Aber danke für den Hinweis 🙂



  • GPC schrieb:

    Simon2 schrieb:

    CStoll schrieb:

    ...Warum über strncpy()? std::string bietet sogar eine eigene Methode copy() dafür an.

    Oha, das wusste ich auch noch nicht ... peinlich.
    🙄

    Ich auch nicht. Ist aber auch egal, da es die Lösung in dem Sinn nicht wirklich verbessert.
    Aber danke für den Hinweis 🙂

    Naja, ich finde es schon gut, wenn man nicht noch cstring einbinden muß (für strncpy())....

    Aber mir ging es einfach prinzipiell darum, dass ich immer zu strncpy() gegeriffen habe in so einer Situation - und das eben nicht mehr brauche ! 👍

    Gruß,

    Simon2.



  • Simon2 schrieb:

    GPC schrieb:

    Simon2 schrieb:

    CStoll schrieb:

    ...Warum über strncpy()? std::string bietet sogar eine eigene Methode copy() dafür an.

    Oha, das wusste ich auch noch nicht ... peinlich.
    🙄

    Ich auch nicht. Ist aber auch egal, da es die Lösung in dem Sinn nicht wirklich verbessert.
    Aber danke für den Hinweis 🙂

    Naja, ich finde es schon gut, wenn man nicht noch cstring einbinden muß (für strncpy())....

    Hm, der Header ist nicht so riesieg und ich brauch ihn meistens eh, weil ich oft auch char * verwende.

    Aber mir ging es einfach prinzipiell darum, dass ich immer zu strncpy() gegeriffen habe in so einer Situation - und das eben nicht mehr brauche ! 👍

    Ich werd's nach wie vor tun 😉


  • Mod

    GPC schrieb:

    Simon2 schrieb:

    GPC schrieb:

    Simon2 schrieb:

    CStoll schrieb:

    ...Warum über strncpy()? std::string bietet sogar eine eigene Methode copy() dafür an.

    Oha, das wusste ich auch noch nicht ... peinlich.
    🙄

    Ich auch nicht. Ist aber auch egal, da es die Lösung in dem Sinn nicht wirklich verbessert.
    Aber danke für den Hinweis 🙂

    Naja, ich finde es schon gut, wenn man nicht noch cstring einbinden muß (für strncpy())....

    Hm, der Header ist nicht so riesieg und ich brauch ihn meistens eh, weil ich oft auch char * verwende.

    Aber mir ging es einfach prinzipiell darum, dass ich immer zu strncpy() gegeriffen habe in so einer Situation - und das eben nicht mehr brauche ! 👍

    Ich werd's nach wie vor tun 😉

    irgendwie erscheint mir strncpy als die mit Abstand schlechteste Variante sowohl hinsichtlich Performance als auch Stil und sie kommt auch nicht mit eingebetteten \0 zu recht - vielleicht ist das aber gewollt. Solange sich niemand anderes damit quälen muss, mag das ok sein.



  • Hi,

    ich wollte auch strncpy() nicht verdammen .. aber es ist immer besser, noch eine Alternative zu kennen.

    Gruß,

    Simon2.



  • Nein, versuche es lieber mit CString<*CMap<-exp(PI)><Ö>>



  • Ich verwende für gewöhnlich memcpy, wenn ich cstrings kopiere.



  • Wollte auch grad sagen, ich verwenden meist memcpy() wenn ich die Grösse schon kenne, oder halt std::copy - je nachdem.



  • lolz_offline schrieb:

    Ich verwende für gewöhnlich memcpy, wenn ich cstrings kopiere.

    ... sollte ich nicht wundern, wenn einige Implementationen sowieso strcpy() als memcpy(..., ..., strlen()) umgesetzt haben ...
    Nachdem ich

    #define strncpy memcpy
    

    gesehen habe, überrasct mich gar nichts mehr...

    Gruß,

    Simon2.


Anmelden zum Antworten