String nach cahr* kasten



  • Hi,

    könnt ihr mir sagen wie ich ein String nach char* casten kann?

    gruss bbm



  • std::string wort("Huuuh?");
    wort.c_str();
    


  • Vorsicht, sieh den Pointer den Du als Rückgabe von std::string::c_str( ) bekommst lieber als _const_ char* an!

    Greetz, Swordfish



  • Panke schrieb:

    std::string wort("Huuuh?");
    wort.c_str();
    

    Das Problem ist manchmal, dass hier auf ein char const* gecastet wird.
    Auf ein (nonconst) char* geht's nicht. Aber man kann natürlich ein char[] entsprechend füllen und nach Veränderung in den string zurückkopieren.

    std::string wort("Huuuh?");
    
    // string -> char
    char *c = new char[wort.length()+1];
    strncpy(c, wort.c_str(), wort.length()); //aus cstring
    
    // char benutzen 
    c[1] = 'a';
    
    // string -> char 
    wort = std::string(c);
    
    // aufräumen
    delete[] c;
    

    Gruß,

    Simon2.



  • Na dann sollte man noch erwähnen:

    Wenn man garantieren kann, das nur gelesen wird, kann man noch einen const_cast ansetzen um das Ergebnis passend zu machen.



  • Knuddlbaer schrieb:

    Na dann sollte man noch erwähnen:

    Wenn man garantieren kann, das nur gelesen wird, kann man noch einen const_cast ansetzen um das Ergebnis passend zu machen.

    Ach, wenn man garantieren kann, dass nur gelesen wird, sollte man "char const*" verwenden ! 😉

    Gruß,

    Simon2.

    P.S.: Jaja, ich weiß: Es gibt viele schlechte Schnittstellen....



  • Na wenn wir schon die Goldwaage auspacken, sei angemerkt, das

    .c_str() nicht auf const value_type * castet sondern const value_type * zurück gibt - zumal in der Fragestellung nach char* verlangt wurde ;o)



  • @Simon: Dein Beispiel ist aber arg konstruiert - diese direkte Modifikation kann auch (und wesentlich sicherer) auf dem String erledigt werden.

    Und const_cast sollte nur ein letzter Ausweg sein, wenn du eine schlecht designte externe Funktion verwenden willst, die auf einen 'char*' nur lesend zugreifen will (normalerweise sollten solche Funktionen ihre Parameter als 'const char*' erwarten).



  • CStoll schrieb:

    @Simon: Dein Beispiel ist aber arg konstruiert - diese direkte Modifikation kann auch (und wesentlich sicherer) auf dem String erledigt werden....

    Es ging mir eigentlich um den Aufruf einer "C-String-Funktion"; typische String-Funktionen (wie das reine Setzen eines einzelnen Characters in meinem Beispiel) können auf jeden Fall mit std::strings besser gemacht werden.

    Wichtig war mir dabei das "...char benutzen ...", nicht die Codezeile. Und gebracht habe ich das, weil es hier immer wieder Leute gibt, die meinen, in ihrem Programm müssten sie mit char* arbeiten, weil sie irgendwo eine Funktion nutzen müssen, die einen char* entgegennimmt.
    Ich dagegen will gerade zur Verwendung von std::string motivieren .... indem ich zeige, wie man dann trotzdem die char*-Funktion nutzen kann.

    OK, päppele ich das Ganze nochmal auf:

    // nimmt (evtl. auch schreibend) eine Zeichenkette als char* entgegen
    // ... auf Implementation habe ich keinen Einfluß; sehe sie vllt. nichtmal
    extern void fremdeAPIFunktion(char*);
    
    std::string wort("Huuuh?");
    
    // string -> char
    char *c = new char[wort.length()+1];
    strncpy(c, wort.c_str(), wort.length()); //aus cstring
    
    // char benutzen 
    fremdeAPIFunktion(c);
    
    // string -> char 
    wort = std::string(c);
    
    // aufräumen
    delete[] c;
    

    Ergo: IMMER std::string NEHMEN !!! und nur dort, wo man unbedingt einen char* braucht, nach obigem Schema Hin- und Herkonvertieren !

    Besser ? 😉

    Gruß,

    Simon2.

    P.S.:

    CStoll schrieb:

    ...
    Und const_cast sollte nur ein letzter Ausweg sein, wenn du eine schlecht designte externe Funktion verwenden willst, die auf einen 'char*' nur lesend zugreifen will (normalerweise sollten solche Funktionen ihre Parameter als 'const char*' erwarten).

    const_cast würde ich zugunsten der obigen "Kopierversion" vermeiden - man kann nie wissen, was Leute, die kein const kennen, mit dem Speicher wirklich anstellen...



  • Nun, man hat halt nicht immer den Einfluss darauf was der Fragende machen will. Richtig ist deutlichst darauf hinzuweisen, das die Rückgabe von c_str() nur für Lesezugriffe gedacht ist.

    IMHO falsch ist aber die Aussage: "IMMER std::string NEHMEN" , wenn man sehr viel mit Funktionen arbeiten muss die char* erwarten, könnte man ja auch in betracht ziehen einen vector<char> zu verwenden und könnte sich das new und delete sparen....

    Aber eigentlich ists wurscht, die Antwort auf die 1 Frage gab es ja 🤡


Log in to reply