2016-06-21 4 views
1

Unten ist mein Code:C Zeichenfolge TCHAR Konvertieren ++ *

string szDllPath = "12345"; 
size_t size = szDllPath.length(); 
TCHAR* wArr = new TCHAR[size]; 
for (size_t i = 0; i < size; ++i) 
    wArr[i] = _T(szDllPath[i]); 

cout<<szDllPath<<endl; 
cout<<wArr<<endl; 

Und ich bekomme diese:

enter image description here

Ich verstehe nicht, warum ich die zusätzlichen Zeichen zu bekommen, und wie man löse es ?

+0

Sie benötigen um das abschließende Nullzeichen 'wArr [Größe] = '\ 0';' hinzuzufügen.Offensichtlich müssen Sie 'TCHAR * wArr = new TCHAR [Größe + 1];' – chema989

+4

Nur ** nicht ** erklären. Benutze nicht die 'TCHAR'-Abscheulichkeit von Microsoft. Es ist die Unterstützung für die Bereitstellung einer eingeschränkten Funktionalität Ihres Programms für Windows 9x, und es wurde bereits im Jahr 2000 mit der Einführung von Layer für Unicode veraltet. Seit Microsoft die Tool-Unterstützung für Windows 2000 und früher eingestellt hat, ist das ganze Zeug veraltet. Es handelt sich also um eine veraltete Technologie, die durch eine mittlerweile veraltete Technologie ersetzt wurde, die ein Problem anspricht, das Sie in der Zeit zurücklegen müssen, um darauf zu treffen. –

Antwort

2

Sie haben vergessen, Platz für eine abschließende Null und fügen Sie hinzu.

0

Sie müssen vorsichtig sein, wenn Sie mit char * Varianten von Strings in C und C++ arbeiten. Sie sind erforderlich, um eine Beendigung 0 bei der haben und, und Sie nicht bieten den Raum für sie

TCHAR* wArr = new TCHAR[size+1]; 
... 
/*add a terminating zero after the loop*/ 
wArr[size] = 0; 

Es wäre wie erwartet.

Vermeiden Sie auch solche nackten Char * -Operationen, wenn Sie können.

2

Vorwort:

Neuer Code sollte nicht Generic-Text Mappings werden. Sie wurden in den 90er Jahren erfunden, um die Portierung von Code von ANSI-Systemen (Win9x) auf Unicode-Systeme (Windows NT) zu erleichtern. TCHAR expandiert entweder zu char oder wchar_t gesteuert durch die UNICODE und _UNICODE Präprozessorsymbole.
Verwenden Sie nicht TCHAR, es sei denn, Sie müssen Win9x unterstützen.

Analyse:

Sie machen so komplizierter, als es ist. Da dieser Code

TCHAR* wArr = ...; 
cout << wArr << endl; 

schreibt eine Zeichenkette cout (im Vergleich zu einem Zeigerwert), haben Sie nicht die Präprozessorsymbole UNICODE oder _UNICODE definiert. Mit anderen Worten: Sie verwenden MBCS-Zeichencodierung (siehe Unicode and MBCS) und die folgenden würde identisch Ausgabe erzeugen:

string szDllPath = "12345"; 
cout << szDllPath.c_str() << endl; 

Wenn das wirklich ist, was Sie wollen (und ich bezweifle es ist), dann einfach Aufruf std::basic_string::cstr() ist ausreichend (verwenden Sie std::basic_string::data(), wenn Sie eine veränderbare Zeichenfolge benötigen).

Empfohlene Lösung:

Verwenden Unicode im gesamten Gebäude. Das Folgende löst Ihr unmittelbares Problem, wenn Sie ein Zeichenkettenliteral verwenden.

wstring szDllPath = L"12345"; 
wcout << szDllPath.c_str() << endl; 

Wenn Sie kein Zeichenkettenliteral verwenden und müssen von einem std::string zu einer breiten Zeichenfolge konvertieren, können Sie CString Klasse MFC verwenden, um die Konvertierung durchführen:

CStringW wideString(szDllPath.c_str()); // Conversion c'tor, taking a const char* 
const wchar_t* = (LPCWSTR)wideString; // Invoke operator LPCWSTR()