Ich verstehe c_str
konvertiert eine Zeichenfolge, die nullterminiert sein kann oder nicht, in eine nullterminierte Zeichenfolge.
Ist das wahr? Können Sie einige Beispiele nennen?
Amit Singh Tomar
Ich verstehe c_str
konvertiert eine Zeichenfolge, die nullterminiert sein kann oder nicht, in eine nullterminierte Zeichenfolge.
Ist das wahr? Können Sie einige Beispiele nennen?
Jon
c_str
gibt a zurück const char*
das zeigt auf eine nullterminierte Zeichenkette (dh eine Zeichenkette im C-Stil). Es ist nützlich, wenn Sie den “Inhalt”¹ von an übergeben möchten std::string
zu einer Funktion, die erwartet, mit einer Zeichenfolge im C-Stil zu arbeiten.
Betrachten Sie beispielsweise diesen Code:
std::string string("Hello, World!");
std::size_t pos1 = string.find_first_of('w');
std::size_t pos2 = static_cast<std::size_t>(std::strchr(string.c_str(), 'w') - string.c_str());
if (pos1 == pos2) {
std::printf("Both ways give the same result.\n");
}
Anmerkungen:
¹ Das ist nicht ganz richtig, weil an std::string
(im Gegensatz zu einem C-String) kann die enthalten \0
Charakter. Wenn dies der Fall ist, der Code, der den Rückgabewert von erhält c_str()
wird getäuscht, dass die Zeichenfolge kürzer ist als sie wirklich ist, da sie interpretiert wird \0
als Ende der Zeichenfolge.
Sehr interessanter Punkt, den Sie in Notes gemacht haben: Was würde ich gerne wissen, wenn std::string bereits \0 enthalten ist, dann hängt c_str auch \0 am Ende der Zeichenfolge an??
– Amit Singh Tomar
14. September 2011 um 12:46 Uhr
@AmitSinghTomar: Ja, also haben Sie zwei Null-Bytes – eines, das rechtmäßig Teil der Zeichenfolge ist, und eines, das das Null-Terminator sein soll. Aber die Funktion im C-Stil, die den Zeiger empfängt, weiß das nicht.
– Jon
14. September 2011 um 12:47 Uhr
Hinweis: Einige C-APIs fragen nach zwei Argumenten (char const*, size_t
), das zweite ist natürlich die Größe.
– Matthias M.
14. September 2011 um 13:19 Uhr
Das funktioniert nicht: string str("0.85"); newVolume = _tstof((TCHAR*)str.c_str());
wie kann ich TCHAR* argv konvertieren[] 0,85 eingeben?
– Benutzer285594
31. Januar 2017 um 11:24 Uhr
@YumYumYum können Sie nicht verwenden std::string
Zusammen mit TCHAR-Zeug besteht der springende Punkt bei TCHAR darin, automatisch zwischen char/wchar zu wechseln, während std::string
funktioniert nur in Bezug auf char. Sie müssen eine geeignete Abstraktion verwenden oder TCHAR einfach überhaupt nicht verwenden und immer einen Unicode-Build erstellen.
– Jon
31. Januar 2017 um 13:35 Uhr
In C++ definieren Sie Ihre Zeichenfolgen als
std::string MyString;
anstatt
char MyString[20];
.
Beim Schreiben von C++-Code stoßen Sie auf einige C-Funktionen, die einen C-String als Parameter benötigen.
Wie unten:
void IAmACFunction(int abc, float bcd, const char * cstring);
Jetzt gibt es ein Problem. Sie arbeiten mit C++ und verwenden std::string
String-Variablen. Aber diese C-Funktion fragt nach einem C-String. Wie konvertiert ihr eure std::string
auf eine normale C-Saite?
So was:
std::string MyString;
// ...
MyString = "Hello world!";
// ...
IAmACFunction(5, 2.45f, MyString.c_str());
Das ist was c_str()
ist für.
Beachten Sie, dass z std::wstring
Saiten, c_str()
gibt a zurück const w_char *
.
Daniel Mošmondor
Am meisten alt C++- und C-Funktionen verwenden beim Umgang mit Zeichenfolgen const char*
.
Mit STL Und std::string
, string.c_str()
eingeführt wird, um konvertieren zu können std::string
Zu const char*
.
Das bedeutet, dass Sie, wenn Sie versprechen, den Puffer nicht zu ändern, schreibgeschützte Zeichenfolgeninhalte verwenden können. VERSPRECHEN = konst verkohlen*
@So etwas gibt es nicht stl::string
. Tatsächlich gibt es nicht einmal so etwas wie “STL”, außer irgendwo in einem Museum.
– Kerrek SB
14. September 2011 um 12:42 Uhr
@Kerrek SB: STL wird (wurde?) als Synonym für die C++-Standardbibliothek verwendet.
– Peter Mortensen
6. Februar um 0:13
Hier ein Beispiel aus dem Jahr 2020. Oder vielleicht liegt es daran alte Bücher?
– Peter Mortensen
6. Februar um 2:06
Hier ist ein weiteres Beispiel (2010) – „Ich verwende die STL string
“
– Peter Mortensen
6. Februar um 3:05
Linkon Ruul
In der C/C++-Programmierung gibt es zwei Arten von Strings: die C-Strings und die Standard-Strings. Mit dem <string>
Header können wir die Standard-Strings verwenden. Andererseits sind die C-Strings nur ein Array aus normalen Zeichen. Um also einen Standard-String in einen C-String umzuwandeln, verwenden wir die c_str()
Funktion.
Zum Beispiel
// A string to a C-style string conversion //
const char *cstr1 = str1.c_str();
cout<<"Operation: *cstr1 = str1.c_str()"<<endl;
cout<<"The C-style string c_str1 is: "<<cstr1<<endl;
cout<<"\nOperation: strlen(cstr1)"<<endl;
cout<<"The length of C-style string str1 = "<<strlen(cstr1)<<endl;
Und die Ausgabe wird sein,
Operation: *cstr1 = str1.c_str()
The C-style string c_str1 is: Testing the c_str
Operation: strlen(cstr1)
The length of C-style string str1 = 17
CadentOrange
c_str() wandelt einen C++-String in einen C-Style-String um, der im Wesentlichen ein nullterminiertes Array von Bytes ist. Sie verwenden es, wenn Sie eine C++-Zeichenfolge an eine Funktion übergeben möchten, die eine Zeichenfolge im C-Stil erwartet (z. B. viele der Win32 API, Posix Stilfunktionen usw.).
“konvertiert” würde ich nicht sagen. Vielmehr “bietet” die Funktion “Zugriff” auf ein geeignetes Nur-Lese-Zeichen-Array – höchstwahrscheinlich ein Array, das schon immer in der Implementierung von vorhanden war std::string
zunächst.
– Kerrek SB
14. September 2011 um 12:41 Uhr
pmr
Es wird verwendet, um zu machen std::string
interoperabel mit C-Code, der eine Nullterminierung erfordert char*
.
“konvertiert” würde ich nicht sagen. Vielmehr “bietet” die Funktion “Zugriff” auf ein geeignetes Nur-Lese-Zeichen-Array – höchstwahrscheinlich ein Array, das schon immer in der Implementierung von vorhanden war std::string
zunächst.
– Kerrek SB
14. September 2011 um 12:41 Uhr
Peter Mortensen
Sie werden dies verwenden, wenn Sie ein Zeichenfolgenobjekt codieren/decodieren, das Sie zwischen zwei Programmen übertragen.
Nehmen wir an, Sie verwenden Base64 um ein Array in Python zu codieren, und dann möchten Sie das in C++ decodieren. Sobald Sie die Zeichenfolge haben, dekodieren Sie von Base64-dekodiert in C++. Um es wieder in ein Float-Array zu bringen, müssen Sie hier nur Folgendes tun:
float arr[1024];
memcpy(arr, ur_string.c_str(), sizeof(float) * 1024);
Dies ist eine ziemlich häufige Verwendung, nehme ich an.
Diese Art von Code ist nicht portierbar (unter anderem Endianness und Float-Format)
– Phil1970
3. November 2019 um 23:43 Uhr