Es wird nicht automatisch konvertiert (Gott sei Dank). Sie müssen die Methode verwenden 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);
c_str
Wahnsinn eher vollständig vermeiden .vector
wurde genau als Wrapper für dynamische Arrays erfunden, daher scheint es im besten Fall eine verpasste Gelegenheit zu sein und im schlimmsten Fall gegen den Geist von C ++ zu verstoßen.std::string
würde sich automatisch konvertieren) und dann erkläre ich anhand eines kurzen Codebeispiels, was er verwenden sollte. Wenn ich nach vorne denke, 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 bearbeitenc_str()
. Sie sehen meine kurzen Beispiele fälschlicherweise als echten Code zur Problemlösung, was es nicht ist.std::vector<char>
).Weitere Details hier und hier, aber Sie können verwenden
quelle
Wenn ich eine veränderbare Rohkopie des Inhalts eines C ++ - Strings benötigen würde, würde ich Folgendes tun:
und später:
Warum spiele ich nicht wie jeder andere mit std :: vector oder new []? Denn wenn ich eine veränderbare rohe char * -String-Zeichenfolge im C-Stil benötige, möchte ich C-Code aufrufen, der die Zeichenfolge ändert, und C-Code die Zuordnung von Sachen mit free () und die Zuweisung von malloc () aufheben (strdup verwendet malloc) . Wenn ich also meine Rohzeichenfolge an eine in C geschriebene Funktion X übergebe , hat dies möglicherweise eine Einschränkung für das Argument, dass sie auf dem Heap zugewiesen werden muss (z. B. wenn die Funktion möglicherweise Realloc für den Parameter aufrufen möchte). Es ist jedoch höchst unwahrscheinlich, dass ein Argument erwartet wird, das mit (einigen vom Benutzer neu definierten) neuen [] zugewiesen wird!
quelle
strdup
kommt.(Diese Antwort gilt nur für C ++ 98.)
Bitte verwenden Sie keine rohen
char*
.quelle
vector<char>(str.c_str(), str.c_str() + str.size() + 1)
, ohne den Zeichenzeiger einem temporären zuzuweisen.std::basic_string<>::c_str()
ist gültig, bis derstring
geändert oder zerstört wird. Dies bedeutet auch, dass bei nachfolgenden Aufrufen derselbe Wert zurückgegeben wird, solange derstring
nicht geändert wird.vector
diese Weise wird weder Geschwindigkeit noch Platz benötigt . Und wenn man schreiben würde Ausnahme sicher ohne RAII Mechanismus Code (dh unter Verwendung von rohen Zeigern), würde die Komplexität des Codes viel höher sein als dieser einfache Einzeiler.vector
der viel Aufwand und Komplexität mit sich bringt. Wenn Sie ein veränderbares Zeichenarray benötigen, ist ein Zeichenvektor tatsächlich der ideale C ++ - Wrapper. Wenn Ihre Anforderung tatsächlich nur einen const-char-Zeiger erfordert, verwendenc_str()
Sie einfach und Sie sind fertig.Wenn Sie nur eine Zeichenfolge im C-Stil möchten, die denselben Inhalt darstellt:
Wenn Sie eine Zeichenfolge im C-Stil mit neuem Inhalt möchten , besteht eine Möglichkeit (da Sie die Zeichenfolgengröße zur Kompilierungszeit nicht kennen) in der dynamischen Zuweisung:
Vergiss
delete[]
es später nicht.Wenn Sie stattdessen ein statisch zugewiesenes Array mit begrenzter Länge möchten:
std::string
Konvertiert nicht implizit in diese Typen aus dem einfachen Grund, dass dies normalerweise ein Designgeruch ist. Stellen Sie sicher, dass Sie es wirklich brauchen.Wenn Sie definitiv eine brauchen
char*
, ist der beste Weg wahrscheinlich:quelle
&str.front(), &str.back()
(die in C ++ 03 nicht vorhanden sind) statt der häufigerenstr.begin()
undstr.end()
?str.begin()
ist mit oder sogarstd::begin(str)
iteratorartig? Ich glaube nicht, dassstring
es eine Verpflichtung gibt, in zusammenhängender Erinnerung zu seinvector
, oder?&back() + 1
, nicht&back()
Dies wäre besser als Kommentar zu Bobobobos Antwort, aber ich habe keinen Repräsentanten dafür. Es erreicht das Gleiche, aber mit besseren Praktiken.
Obwohl die anderen Antworten nützlich sind, wenn Sie jemals konvertieren müssen ,
std::string
umchar*
explizit ohne const,const_cast
ist dein Freund.Beachten Sie, dass dies nicht eine Kopie der Daten geben; Sie erhalten einen Zeiger auf die Zeichenfolge. Wenn Sie also ein Element von
chr
ändern, ändern Sie esstr
.quelle
Angenommen, Sie benötigen nur eine Zeichenfolge im C-Stil, um sie als Eingabe zu übergeben:
quelle
Um streng pedantisch zu sein, können Sie "einen std :: string nicht in einen char * - oder char [] -Datentyp konvertieren".
Wie die anderen Antworten gezeigt haben, können Sie den Inhalt des std :: string in ein char-Array kopieren oder ein const char * für den Inhalt des std :: string erstellen, damit Sie in einem "C-Stil" darauf zugreifen können. .
Wenn Sie versuchen, den Inhalt des std :: string zu ändern, verfügt der std :: string-Typ über alle Methoden, um alles zu tun, was Sie möglicherweise tun müssen.
Wenn Sie versuchen, es an eine Funktion zu übergeben, die ein Zeichen * akzeptiert, gibt es std :: string :: c_str ().
quelle
Der Vollständigkeit halber nicht vergessen
std::string::copy()
.std::string::copy()
beendet NUL nicht. Wenn Sie einen NUL-Terminator für die Verwendung in C-String-Funktionen sicherstellen müssen:quelle
Hier ist eine weitere robuste Version von
Protocol Buffer
quelle
if (str[str.length()-1] != 0) str.push_back(0)
Konvertierung im OOP-Stil
converter.hpp
converter.cpp
Verwendungszweck
quelle
quelle
Alternativ können Sie Vektoren verwenden, um ein beschreibbares Zeichen * zu erhalten, wie unten gezeigt.
quelle
Sie können es mit dem Iterator machen.
Viel Glück.
quelle
Eine sichere Version von orlps char * Antwort mit unique_ptr:
quelle
Um eine
const char *
von einem zu erhalten,std::string
verwenden Sie diec_str()
Member-Funktion:Um eine Nicht-Konstante
char *
von einer zu erhaltenstd::string
, können Sie die Elementfunktion verwenden, diedata()
seit C ++ 17 einen Nicht-Konstanten-Zeiger zurückgibt:Bei älteren Versionen der Sprache können Sie die Zeichenfolge mithilfe der Bereichskonstruktion in einen Vektor kopieren, aus dem ein nicht konstanter Zeiger abgerufen werden kann:
Beachten Sie jedoch, dass Sie dadurch die darin enthaltene Zeichenfolge nicht ändern
str
können. Nur die Daten der Kopie können auf diese Weise geändert werden. Beachten Sie, dass es in älteren Versionen der Sprache besonders wichtig ist, diese zu verwendenc_str()
, da damalsstd::string
nicht garantiert wurde, dass sie bisc_str()
zum Aufruf mit Null beendet wird .quelle
Dies wird auch funktionieren
quelle