Присвойте переменную wstring массиву Char в C ++ - PullRequest
0 голосов
/ 23 октября 2018

У меня есть массив символов следующим образом:

TCHAR name[256] = L"abc";

Также у меня есть другой вектор wstring следующим образом,

std::vector<std::wstring> nameList;
nameList.push_back(L"cde");
nameList.push_back(L"fgh");

Я хочу назначить nameList вектор первымэлемент в имя массив,

Может ли кто-нибудь помочь мне?

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

Учитывая ваш вопрос и предположение, что вы должны использовать массив вместо wstring, вам лучше всего использовать std::copy или даже старомодный memcpy.Однако это опасно по следующим двум причинам:

  1. Если TCHAR на самом деле не является wchar_t, то, скорее всего, будут ошибки памяти.
  2. Если nameList содержит строку длиной более 255Символы TCHAR у вас будет переполнение буфера.

Тем не менее, вы можете сделать это безопасно следующим образом:

if (nameList[0].size() >= 256) {
    throw std::length_error("string too long");
}
std::copy(nameList[0].begin(), nameList[0].end(), name);
name[nameList[0].size()] = TCHAR(0);

Вы также можете добавить static_assert, чтобы принудительно вызватьошибка компилятора, если TCHAR не является wchar_t, но, вероятно, в этом нет необходимости, поскольку копия будет выполнять любое неявное преобразование на символьной основе.

0 голосов
/ 23 октября 2018

Вы можете использовать std::copy;name - это массив с ограничением, но его использование в качестве аргумента функции распадается на указатель на его первый элемент, который удовлетворяет требованиям для выходного итератора.

Таким образом, вы можете:

wchar_t name[256] = L"abc";

std::vector<std::wstring> nameList;
nameList.push_back(L"cde");
nameList.push_back(L"fgh");

std::copy(nameList.front().begin(), nameList.front().end(), name);

Обратите внимание: это не добавит завершающий \0 терминатор в буфер;Если вы хотите заменить / перезаписать name, вам также следует просто использовать std::wstring и избавить себя от некоторых неприятностей

...