2010-12-20 12 views
2

Ich versuche, eine Zeichenkette in eine wchar Zeichenfolge zu konvertieren.Warum druckt der folgende C++ Code nur das erste Zeichen?

Ausführlicher: Ich versuche, ein Char [] in ein wchar [] zuerst zu konvertieren und dann "1" an diese Zeichenfolge anzufügen und es auszudrucken.

char src[256] = "c:\\user"; 

wchar_t temp_src[256]; 
mbtowc(temp_src, src, 256); 

wchar_t path[256]; 

StringCbPrintf(path, 256, _T("%s 1"), temp_src); 
wcout << path; 

Aber es druckt nur c

Ist dies der richtige Weg von Zeichen zu konvertieren zu WCHAR? Ich habe seither einen anderen Weg kennengelernt. Aber ich würde gerne wissen, warum der obige Code so funktioniert wie er?

Antwort

10

mbtowc konvertiert nur ein einzelnes Zeichen. Wollten Sie mbstowcs verwenden?

In der Regel rufen Sie diese Funktion zweimal auf; die ersten, die erforderliche Puffergröße, und die zweite, um tatsächlich wandeln es zu erhalten:

#include <cstdlib> // for mbstowcs 

const char* mbs = "c:\\user"; 
size_t requiredSize = ::mbstowcs(NULL, mbs, 0); 
wchar_t* wcs = new wchar_t[requiredSize + 1]; 
if(::mbstowcs(wcs, mbs, requiredSize + 1) != (size_t)(-1)) 
{ 
    // Do what's needed with the wcs string 
} 
delete[] wcs; 

Wenn Sie lieber verwenden mbstowcs_s (wegen deprecation Warnungen), dann wie folgt vorgehen:

#include <cstdlib> // also for mbstowcs_s 

const char* mbs = "c:\\user"; 
size_t requiredSize = 0; 
::mbstowcs_s(&requiredSize, NULL, 0, mbs, 0); 
wchar_t* wcs = new wchar_t[requiredSize + 1]; 
::mbstowcs_s(&requiredSize, wcs, requiredSize + 1, mbs, requiredSize); 
if(requiredSize != 0) 
{ 
    // Do what's needed with the wcs string 
} 
delete[] wcs; 

Stellen Sie sicher, Berücksichtigen Sie Gebietsschema-Probleme über setlocale() oder verwenden Sie die Versionen mbstowcs() (wie mbstowcs_l() oder mbstowcs_s_l()), die ein Gebietsschema-Argument verwendet.

+0

+1 - fest zu den Defekten Link :) –

+0

@Billy ONeal: Danke. Bin dankbar. :-) –

+0

'delete [] wcs;' –

0

L "Hallo Welt"

das Präfix L vor dem String macht es einen breiter char-String.

+0

Richtig - aber das beantwortet die Frage des OP nicht wirklich. –

+0

Stimmt, aber das Problem würde trivial werden, anstatt die Umwandlungsfunktionen aufzurufen ... – EnabrenTane

+0

Eigentlich ist char src etwas, das ich nicht unter Kontrolle habe. Sollte in der Frage erwähnt haben. Also kann ich L davor nicht hinzufügen. Es ist nur ein Parameter, der mir übergeben wird. Aber ich habe den Code wie ich gemacht, um die Dinge einfach zu halten :) –

2

Warum verwenden Sie C-Code, und warum schreiben Sie es nicht auf eine portabelere Art, zum Beispiel, was ich hier tun würde, ist die Verwendung der STL!

std::string src = std::string("C:\\user") + 
        std::string(" 1"); 
std::wstring dne = std::wstring(src.begin(), src.end()); 

wcout << dne; 

es ist so einfach, es ist einfach: D

+0

+1 Richtig, Ihr Code sieht auch elegent. Aber ich lerne nur herum C und C++ (nicht Produktionscode). Also mache ich absichtlich mit Sachen rum. Motiv ist es zu verstehen, wie die Dinge funktionieren, aber nicht, um sie einfach auf die bessere Weise zu erledigen :) Danke, aber. –