Почему следующая печать кода C ++ только первый персонаж?

StackOverflow https://stackoverflow.com/questions/4492402

  •  12-10-2019
  •  | 
  •  

Вопрос

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

Более подробно: сначала я пытаюсь преобразовать символ [] в 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

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

Это было полезно?

Решение

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()) это требует аргументации.

Другие советы

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

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

wcout << dne;

это так просто, это легко: D

L "Привет, мир"

Префикс L перед строкой делает его широкой шнуркой.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top