Почему следующий код C ++ печатает только первый символ? - PullRequest
2 голосов
/ 20 декабря 2010

Я пытаюсь преобразовать строку char в строку wchar.

Более подробно: я пытаюсь сначала преобразовать char [] в wchar [], а затем добавить «1» к этой строке и распечатать.

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;

Но он печатает только c

Это правильный способ конвертировать из char в wchar? С тех пор я узнал о другом пути. Но я хотел бы знать, почему приведенный выше код работает так, как работает?

Ответы [ 3 ]

10 голосов
/ 20 декабря 2010

mbtowc преобразует только один символ. Вы хотели использовать mbstowcs?

Обычно вы вызываете эту функцию дважды; первый для получения требуемого размера буфера, а второй для его фактического преобразования:

#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;

Если вы предпочитаете использовать mbstowcs_s (из-за предупреждений об устаревании), сделайте следующее:

#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;

Убедитесь, что вы решаете проблемы с языком через setlocale () или используете версии mbstowcs() (например, mbstowcs_l() или mbstowcs_s_l()), которые принимают аргумент языка.

2 голосов
/ 22 декабря 2010

почему вы используете код C, и почему бы не написать его более переносимым способом, например, что я хотел бы сделать здесь, это использовать STL!

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

wcout << dne;

это так просто, это просто: D

0 голосов
/ 20 декабря 2010

L "Hello World"

префикс L перед строкой делает его широкой символьной строкой.

...