2009-06-03 3 views
4

ODER Wie bringst du dich selbst oder jemanden nicht um, wenn der C++ - Compiler das nächste Mal deinen Arm zwickt, zwischen 2 willkürlichen String-Typen umzuwandeln, nur um dich zu verwirren?Was sind die am häufigsten verwendeten Zeichenfolgetypen in C++ und wie konvertiert man sie?

Ich habe eine schwierige Zeit in C++ zu codieren, da ich VB6, C#, Ruby, für String-Operationen gewohnt bin. Aber jetzt habe ich mehr als 30 Minuten lang versucht, eine Zeichenfolge zu protokollieren, die 2 guids und eine Zeichenfolge in dem Debug-Fenster ... und es ist nicht immer irgendwie einfacher Und ich habe bereits erfüllt RPC_WSTR, std::wstring und LPCWSTR

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

Grundsätzlich bin ich für die am häufigsten verwendeten String-Typen in beiden Standard-APIs und MS-spezifische/Visual C++ Bibliotheken suchen; Was das nächste Mal zu tun, ich sehe

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

aktualisieren: Ich reparierte die ^^^^ Fehler kompilieren. Ich suche nach einer globaleren Antwort, nicht nach der Lösung für ein bestimmtes Problem, das ich als Beispiel aufgeführt habe. Hier

+1

Der Titel sollte Visual C++ anstelle von C++ enthalten, da die Art der Frage String-Typen betrifft, die für eine Windows-Umgebung spezifisch sind. – njsf

+0

Ich denke, es geht im Allgemeinen um String-Typen. Er lief zuerst das Problem mit einem MS-spezifischen Makro (aber es ist nur ein Makro für eine Standard-C-Zeichenfolge, nicht ein separater Typ) – jalf

+0

Richtig .. aktualisiert die Frage zu * nicht MS/Windows-spezifische * – Gishu

Antwort

9

Es gibt zwei integrierte String-Typen:

  • C++ Strings verwenden, um die Klasse std :: string (std :: wstring für breite Zeichen)
  • C-Strings sind const char Zeiger 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 verwenden daher Zeichenzeiger statt der Klasse std :: string.

Microsoft verbirgt diese Zeiger hinter einer Reihe von Makros.

LPCWSTR ist ein Long Pointer zu einem Const Wide String, oder mit anderen Worten, ein const wchar_t*.

LPSTR ist ein langen Zeiger auf String, oder mit anderen Worten, eine char* (nicht const).

Sie haben eine Handvoll mehr, aber sie sollten ziemlich einfach zu erraten sein, sobald Sie diese ersten paar kennen. Sie haben auch * TSTR-Varianten, wobei das T verwendet wird, um anzuzeigen, dass dies entweder normale oder breite Zeichen sind, abhängig davon, ob UNICODE im Projekt aktiviert ist. LPCTSTR wird in LPCWSTR aufgelöst, wenn UNICODE definiert ist, andernfalls LPCSTR.

Also wirklich, wenn Sie mit Strings arbeiten, müssen Sie nur die zwei Typen kennen, die ich oben aufgelistet habe. Der Rest sind nur Makros für verschiedene Varianten der Char-Pointer-Version.

Konvertieren von einem char Zeiger auf eine Zeichenfolge ist einfach:

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

Und die andere Art und Weise nicht viel hader ist:

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

Das heißt, nimmt std::string einen C-String als ein Argument im Konstruktor. Und es hat eine c_str() Member-Funktion, die eine C-style-Zeichenfolge zurückgibt.

Einige häufig verwendete Bibliotheken definieren ihre eigenen Zeichenfolientypen, und in diesen Fällen müssen Sie die Dokumentation auf ihre Interoperabilität mit den "richtigen" Zeichenfolgenklassen prüfen.

Normalerweise sollten Sie die Klasse C++ std::string bevorzugen, da sie sich im Gegensatz zu Zeichenzeigern als Zeichenfolgen verhalten. 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. 
+0

+1 Danke ... das ergab für mich einen Sinn. – Gishu

2

ist ein article das Ding deckt Sie brauchen vor allem für CString

0

Willkommen in C++ ;-)

Sie können nur eine Wrapper-Funktion erstellen, die eine std::string akzeptiert. Dann extrahieren Sie in der Funktion die c-style Zeichenfolge und übergeben Sie sie an OutputDebugStringW.

+0

für MFC-Windows world right – yesraaj

1
OutputDebugStringW (myString.c_str()); 
0

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

Beide haben eine .c_str() -Methode, die einen konventionellen C-String-Zeiger (LPCWSTR etc.) und einen Konstruktor, der eine C-Zeichenfolge nimmt, zurückgibt.

0

Sie möchten vielleicht CStdString betrachten. Es handelt sich um eine plattformübergreifende C++ CString-Standardimplementierung, die ziemlich einfach in die meisten anderen Stringtypen konvertiert werden kann. Macht fast alle string-bezogenen Kopfschmerzen weg und es ist nur eine Header-Datei.

Verwandte Themen