Was sind die am häufigsten verwendeten String-Typen in C ++ und wie konvertieren Sie zwischen ihnen?

StackOverflow https://stackoverflow.com/questions/944516

  •  09-09-2019
  •  | 
  •  

Frage

Oder wie Sie sich oder jemanden nicht töten, wenn der C ++ - Compiler Ihren Arm das nächste Mal zwischen 2 willkürlichen String -Typen umwandelt, um mit Ihnen zu spielen?

Ich habe es schwer, in C ++ zu codieren, da ich an VB6, C#, Ruby, für String -Operationen gewohnt bin. Aber jetzt habe ich über 30 Minuten damit verbracht, eine Zeichenfolge zu protokollieren, die 2 Guids und eine Zeichenfolge für das Debug -Fenster enthält ... und es wird nicht einfacher und ich habe mich bereits getroffen RPC_WSTR, std::wstring und LPCWSTR

Gibt es einfache (oder) Regeln, um die Conversions zwischen ihnen zu kennen? Oder kommt es erst nach Jahren der Folter?

Grundsätzlich suche ich nach den am häufigsten verwendeten String-Typen sowohl in Standard-APIs als auch in MS-spezifischen/visuellen C ++-Bibliotheken. Was das nächste Mal tun soll, sehe ich

Error   8   error C2664: 'OutputDebugStringW' : cannot convert parameter 1 from 'std::wstring' to 'LPCWSTR'

Aktualisieren: Ich habe den ^^^^ Compile -Fehler behoben. Ich suche eine globalere Antwort für die Lösung für bestimmte Ausgaben, die ich als Beispiel aufgeführt habe.

War es hilfreich?

Lösung

Es gibt zwei eingebaute Zeichenfolgentypen:

  • C ++ Saiten verwenden die STD :: String -Klasse (STD :: WSTRING für breite Zeichen)
  • C-Style-Saiten sind const char pointers const char*) (oder const wchar_t*)

Beide können in C ++ - Code verwendet werden. Die meisten APIs, einschließlich Windows, sind in C geschrieben, und daher verwenden sie Charb -Zeiger und nicht in der Std :: String -Klasse.

Microsoft verbirgt diese Zeiger weiter hinter einer Reihe von Makros.

Lpcwstr ist a Langer Zeiger auf eine const breite Zeichenfolge, oder mit anderen Worten a const wchar_t*.

LPSTR ist a Langer Zeiger auf String, oder mit anderen Worten a char* (nicht const).

Sie haben eine Handvoll mehr, aber sie sollten ziemlich leicht zu erraten sein, wenn Sie diese ersten paar kennen. Sie haben auch *TSTR -Varianten, wobei das T verwendet wird, um anzuzeigen, dass dies entweder normale oder breite Zeichen sein kann, je nachdem, ob Unicode im Projekt aktiviert ist. LPCTSTR beschließt zu LPCWSTR, wenn Unicode definiert ist, und ansonsten LPCSTR.

Wenn Sie also mit Saiten arbeiten, müssen Sie nur die beiden Typen kennen, die ich oben aufgeführt habe. Der Rest sind nur Makros für verschiedene Varianten der Charoter -Version.

Das Konvertieren von einem Zeichenzeiger in eine Zeichenfolge ist einfach:

const char* cstr = "hello world";
std::string cppstr = cstr;

Und der andere Weg ist nicht viel Hader:

std::string cppstr("hello world");
const char* cstr = cppstr.c_str();

Das ist, std::string Nimmt eine Schnur im C-Stil als Argument im Konstruktor. Und es hat eine c_str() Mitgliedsfunktion, die eine Zeichenfolge im C-Stil zurückgibt.

Einige häufig verwendete Bibliotheken definieren ihre eigenen String -Typen, und in diesen Fällen müssen Sie die Dokumentation darüber überprüfen, wie sie mit den "richtigen" Stringklassen zusammenarbeiten.

Sie sollten normalerweise das C ++ bevorzugen std::string Klasse, im Gegensatz zu Char -Zeigern, sie sich verhalten als Saiten. Zum Beispiel:

std:string a = "hello ";
std:string b = "world";
std:string c = a + b; // c now contains "hello world"

const char* a = "hello ";
const char* b = "world";
const char* c = a + b; // error, you can't add two pointers

std:string a = "hello worl";
char b = 'd';
std:string c = a + b; // c now contains "hello world"

const char* a = "hello worl";
char b = 'd';
const char* c = a + b; // Doesn't cause an error, but won't do what you expect either. the char 'd' is converted to an int, and added to the pointer `a`. You're doing pointer arithmetic rather than string manipulation.

Andere Tipps

Hier ist ein Artikel Das deckt die Sache ab, die Sie hauptsächlich für Cstring brauchen

OutputDebugStringW (myString.c_str ());

Willkommen bei C ++ ;-)

Sie können einfach eine Wrapper -Funktion erstellen, die a akzeptiert std::string. Dann extrahieren Sie in der Funktion die Zeichenfolge im C-Stil und übergeben Sie sie an OutputDebugStringW.

std::wstring und std::string sind nur Aliase für std::basic_string<wchar_t> und std::basic_string<char>.

Beide haben a .c_str()-Method, das einen herkömmlichen C-String-Zeiger zurückgibt (LPCWSTR usw.) und ein Konstruktor, der eine C-String nimmt.

Vielleicht möchten Sie sich ansehen CSTDString. Es handelt sich um eine Cross -Plattform -Standard -C ++ - Cstring -Implementierung, die ziemlich einfach in die meisten anderen String -Typen umwandelt. Fast alle mit String bezogenen Kopfschmerzen verschwinden und es ist nur eine Header -Datei.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top