Warum druckt der folgende C ++ Code nur das erste Zeichen?
Frage
Ich versuche, einen char-String in einem wchar Zeichenfolge zu konvertieren.
Im Detail: Ich versuche, ein Zeichen zu konvertieren [] zu einem wchar [] und dann append „1“ zu dieser Zeichenfolge und der Druck es
.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 char wchar zu konvertieren? Ich bin gekommen, da eine andere Art und Weise kennen zu lernen. Aber ich würde gerne wissen, warum der obige Code so funktioniert, es funktioniert?
Lösung
mbtowc
wandelt nur ein einzelnes Zeichen. Meinen Sie verwenden mbstowcs
?
Normalerweise rufen Sie diese Funktion zweimal; die erste, die erforderliche Puffergröße, und die zweite, um tatsächlich wandelt 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 dies zu tun:
#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, dass kümmern locale Fragen über setlocale () oder mit den Versionen von mbstowcs()
(wie mbstowcs_l()
oder mbstowcs_s_l()
), das ein locale Argumente.
Andere Tipps
Warum verwenden Sie C-Code, und warum es nicht in einer tragbaren Weise schreiben, zum Beispiel, was ich hier zu tun ist, um die STL verwenden!
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
L "Hallo Welt"
das Präfix L vor dem String macht es einen breiter char-String.