std::string to char*

Lesezeit: 8 Minuten

Ich möchte a konvertieren std::string in ein verkohlen* oder verkohlen[] Datentyp.

std::string str = "string";
char* chr = str;

Ergebnisse in: „Fehler: „std::string“ kann nicht in „char“ konvertiert werden …“.

Welche Methoden gibt es dafür?

  • Beantwortet das deine Frage? So konvertieren Sie einen std::string in const char* oder char*

    – lese

    24. Juni 2021 um 14:05 Uhr

stdstring to char
Orlp

Es wird nicht automatisch konvertiert (Gott sei Dank). Sie müssen die Methode anwenden c_str() um die C-String-Version zu erhalten.

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

Beachten Sie, dass es a zurückgibt const char *; Sie dürfen die von zurückgegebene Zeichenfolge im C-Stil nicht ändern c_str(). Wenn Sie es verarbeiten möchten, müssen Sie es zuerst kopieren:

std::string str = "string";
char *cstr = new char[str.length() + 1];
strcpy(cstr, str.c_str());
// do stuff
delete [] cstr;

Oder in modernem C++:

std::vector<char> cstr(str.c_str(), str.c_str() + str.size() + 1);

  • @Kerrek SB: Es war ein Beispiel, würde einen intelligenten Zeiger in echtem Code verwenden oder dies eher vermeiden c_str Wahnsinn komplett.

    – orlp

    8. September 2011 um 17:37 Uhr

  • Die Antwort ist sperrig, unelegant, nicht lokal, verwendet rohe Arrays und erfordert Aufmerksamkeit für die Ausnahmesicherheit. vector wurde genau als Wrapper für dynamische Arrays erfunden, daher scheint es bestenfalls eine verpasste Gelegenheit zu sein, es nicht zu verwenden, und schlimmstenfalls eine Verletzung des Geists von C++.

    – Kerrek SB

    8. September 2011 um 20:11 Uhr

  • Zunächst einmal, ja, die Antwort ist sperrig. Zuerst erkläre ich den Fehler des OP (denke das std::string würde automatisch konvertieren) und dann erkläre ich, was er verwenden soll, mit einem kurzen Codebeispiel. Vorausschauend erkläre ich auch einige Nebenwirkungen der Verwendung dieser Funktion, von denen eine darin besteht, dass Sie die von zurückgegebene Zeichenfolge möglicherweise nicht bearbeiten c_str(). Sie sehen meine kurzen Beispiele fälschlicherweise als echten Problemlösungscode, was es nicht ist.

    – orlp

    8. September 2011 um 20:19 Uhr

  • Ich habe die Antwort abgelehnt. Diese Antwort ist in der Tat nicht nützlich, und die Tatsache, dass sie akzeptiert wurde, ist höchst bedauerlich. Diese Antwort lässt gute C++-Programmierpraktiken und Ausnahmesicherheit völlig außer Acht, und es gibt weitaus bessere Lösungen, von denen einige in anderen Antworten auf diese Frage gegeben werden (z. B. die Antwort von ildjarn, die verwendet std::vector<char>).

    – James McNellis

    8. September 2011 um 20:27 Uhr


  • @james-mcnellis, ich habe diese Antwort als die richtige ausgewählt, weil sie geantwortet hat EXAKT wonach ich gefragt habe… Nicht mehr und nicht weniger. Ich habe nicht nach dem gefragt, was Sie Ihrer Meinung nach tun sollten, ich habe nicht nach einer anderen Lösung für das gefragt, was Sie Ihrer Meinung nach tun, ich habe nicht nach bewährten Praktiken gefragt. Sie haben keine Ahnung, woran ich arbeite, wo mein Code implementiert wird und unter welchen Bedingungen. Einige sollten lernen zu lesen, Fragen zu verstehen und zu beantworten, was tatsächlich gefragt wird. Hier muss man nicht angeben.

    Benutzer912695

    9. September 2011 um 16:19 Uhr

1646665220 827 stdstring to char
bobobobo

Mehr Details hier, und hier, aber Sie können verwenden

string str = "some string" ;
char *cstr = &str[0];

Ab C++11 können Sie auch die str.data() Mitgliedsfunktion, die zurückkehrt char *

string str = "some string" ;
char *cstr = str.data();

  • FWIW, in meinem Buch ist dies die einzig richtige Antwort auf die eigentlich gestellte Frage. Ein std::string ist von Natur aus veränderlich: Leute, die es so klingen lassen, als wäre das Ändern des Inhalts des Strings irgendwie Teufelswerk, scheinen diese Tatsache zu übersehen.

    – Jay Freeman -saurik-

    4. Oktober 2013 um 1:25 Uhr


  • ja, das ist die richtige antwort. Es ist albern, dass es angesichts der Häufigkeit der Verwendung keine Standardmethode dafür gibt, wie z. B. den Lockbuffer von msoft.

    – Erik Aronesty

    28. Januar 2015 um 17:24 Uhr

  • Ich habe 0 in 0u geändert. Da sich einige Compiler/Bibliotheken (ob Sie es glauben oder nicht) über einige Zweideutigkeiten beschweren werden, wenn Warnungen für &str vollständig eingeschaltet sind[0] bauen

    – Erik Aronesty

    28. Januar 2015 um 18:05 Uhr

  • Beachten Sie, dass dies nur C++11 ist. Frühere Versionen haben möglicherweise keinen kontinuierlichen Speicher oder es fehlt die abschließende Null

    – Flammenfeuer

    29. Juni 2017 um 20:14 Uhr

  • Dies ist aus irgendeinem Grund der einzige, der für mich funktioniert hat c_str() hielt immer wieder bei meinen Nullbytes an, obwohl mein Lesen darauf hinzudeuten scheint, dass dies nicht der Fall sein sollte. Vielleicht habe ich woanders was falsch gemacht, aber getauscht c_str() mit diesem (oder sogar &str.first()) funktionierte perfekt

    – Brian Leishmann

    6. August 2018 um 13:36 Uhr

stdstring to char
Nordischer Großrechner

Wenn ich eine veränderbare Rohkopie des Inhalts einer Zeichenfolge in c++ benötigen würde, würde ich Folgendes tun:

std::string str = "string";
char* chr = strdup(str.c_str());

und später:

free(chr); 

Warum spiele ich also nicht mit std::vector oder new herum[] wie jeder andere? Weil wenn ich eine veränderliche rohe char*-Zeichenfolge im C-Stil benötige, dann, weil ich C-Code aufrufen möchte, der die Zeichenfolge ändert, und C-Code die Zuordnung von Dingen mit free() aufhebt und mit malloc() zuweist (strdup verwendet malloc). Wenn ich also meinen rohen String an eine Funktion X übergebe in C geschrieben es könnte haben eine Einschränkung für das Argument, das auf dem Heap zugewiesen werden muss (z. B. wenn die Funktion möglicherweise realloc für den Parameter aufrufen möchte). Aber es ist höchst unwahrscheinlich, dass es ein Argument erwarten würde, das mit (einige Benutzer neu definiert) neu zugewiesen wurde[]!

  • Du solltest erklären wo strdup ist von.

    – LF

    8. Mai 2019 um 10:31 Uhr

1646665223 815 stdstring to char
ildjarn

(Diese Antwort gilt nur für C++98.)

Bitte verwenden Sie kein Raw char*.

std::string str = "string";
std::vector<char> chars(str.c_str(), str.c_str() + str.size() + 1u);
// use &chars[0] as a char*

stdstring to char
Leichtigkeitsrennen im Orbit

  • Wenn Sie nur eine Zeichenfolge im C-Stil möchten, die denselben Inhalt darstellt:

    char const* ca = str.c_str();
    
  • Wenn Sie eine Zeichenfolge im C-Stil mit möchten Neu Inhalte, eine Möglichkeit (vorausgesetzt, Sie kennen die Zeichenfolgengröße zur Kompilierzeit nicht) ist die dynamische Zuordnung:

    char* ca = new char[str.size()+1];
    std::copy(str.begin(), str.end(), ca);
    ca[str.size()] = '\0';
    

    Vergiss es nicht delete[] es später.

  • Wenn Sie stattdessen ein statisch zugewiesenes Array mit begrenzter Länge wünschen:

    size_t const MAX = 80; // maximum number of chars
    char ca[MAX] = {};
    std::copy(str.begin(), (str.size() >= MAX ? str.begin() + MAX : str.end()), ca);
    

std::string konvertiert nicht implizit in diese Typen, aus dem einfachen Grund, dass dies normalerweise ein Designgeruch ist. Stellen Sie sicher, dass Sie Ja wirklich brauchen.

Wenn du bestimmt brauche char*der Beste Weg ist wahrscheinlich:

vector<char> v(str.begin(), str.end());
char* ca = &v[0]; // pointer to start of vector

  • Warum &str.front(), &str.back() (die in C++03 nicht vorhanden sind) anstelle der gebräuchlicheren str.begin() und str.end()?

    – Armen Tsirunyan

    8. September 2011 um 17:30 Uhr

  • wie wäre es mit str.begin()oder auch std::begin(str), iteratorartig? Ich glaube nicht string hat keine Verpflichtung, im zusammenhängenden Speicher wie sein vectoroder hat es?

    – xtofl

    8. September 2011 um 17:33 Uhr

  • @xtofl: Ich habe diese bereits bearbeitet. Und ja, ab C++ 11 gibt es eine Verpflichtung; dies war in C++03 implizit.

    – Leichtigkeitsrennen im Orbit

    8. September 2011 um 17:34 Uhr


  • @xtofl: Nicht in C++03. In C++11 haben wir diese Garantie zusammen mit den Funktionen front() und back(), die in der ursprünglichen Antwort sowieso missbraucht wurden

    – Armen Tsirunyan

    8. September 2011 um 17:35 Uhr

  • @Tomalak: Sie wurden dahingehend missbraucht, dass Sie sie brauchten &back() + 1nicht &back()

    – Armen Tsirunyan

    8. September 2011 um 17:39 Uhr


Dies wäre besser als Kommentar zu Bobobobos Antwort, aber ich habe keinen Repräsentanten dafür. Es erreicht dasselbe, aber mit besseren Praktiken.

Obwohl die anderen Antworten nützlich sind, wenn Sie jemals konvertieren müssen std::string zu char* explizit ohne const, const_cast ist dein Freund.

std::string str = "string";
char* chr = const_cast<char*>(str.c_str());

Beachten Sie, dass dies der Fall ist nicht Ihnen eine Kopie der Daten zu geben; Es gibt Ihnen einen Zeiger auf die Zeichenfolge. Wenn Sie also ein Element von ändern chrwerden Sie ändern str.

  • Warum &str.front(), &str.back() (die in C++03 nicht vorhanden sind) anstelle der gebräuchlicheren str.begin() und str.end()?

    – Armen Tsirunyan

    8. September 2011 um 17:30 Uhr

  • wie wäre es mit str.begin()oder auch std::begin(str), iteratorartig? Ich glaube nicht string hat keine Verpflichtung, im zusammenhängenden Speicher wie sein vectoroder hat es?

    – xtofl

    8. September 2011 um 17:33 Uhr

  • @xtofl: Ich habe diese bereits bearbeitet. Und ja, ab C++ 11 gibt es eine Verpflichtung; dies war in C++03 implizit.

    – Leichtigkeitsrennen im Orbit

    8. September 2011 um 17:34 Uhr


  • @xtofl: Nicht in C++03. In C++11 haben wir diese Garantie zusammen mit den Funktionen front() und back(), die in der ursprünglichen Antwort sowieso missbraucht wurden

    – Armen Tsirunyan

    8. September 2011 um 17:35 Uhr

  • @Tomalak: Sie wurden dahingehend missbraucht, dass Sie sie brauchten &back() + 1nicht &back()

    – Armen Tsirunyan

    8. September 2011 um 17:39 Uhr


1646665227 260 stdstring to char
Markus B

Angenommen, Sie benötigen nur eine Zeichenfolge im C-Stil, die als Eingabe übergeben werden soll:

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

967080cookie-checkstd::string to char*

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy