Was ist die Verwendung der c_str-Funktion?

Lesezeit: 5 Minuten

Benutzeravatar von Amit Singh Tomar
Amit Singh Tomar

Ich verstehe ist c_str Konvertieren Sie eine Zeichenfolge, die nullterminiert sein kann oder nicht, in eine nullterminierte Zeichenfolge.

Ist das wahr? Können Sie einige Beispiele nennen?

Jons Benutzeravatar
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");
}

Sehen Sie es in Aktion.

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 von

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 *.

Benutzeravatar von Daniel Mošmondor
Daniel Mošmondor

Die meisten ALTEN C++- und C-Funktionen verwenden, wenn sie mit Strings arbeiten 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

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

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, Funktionen im POSIX-Stil 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


Benutzeravatar von pmr
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


Oh, ich muss hier meine eigene Auswahl hinzufügen, Sie werden dies verwenden, wenn Sie ein Zeichenfolgenobjekt codieren/decodieren, das Sie zwischen zwei Programmen übertragen.

Angenommen, Sie verwenden base64encode für ein Array in Python und möchten das dann in C++ decodieren. Sobald Sie die Zeichenfolge haben, die Sie von base64decode in c++ dekodieren. Um es wieder in das 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

1420130cookie-checkWas ist die Verwendung der c_str-Funktion?

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

Privacy policy