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

TCHAR name[256] = L"abc";

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

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

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

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

0
Namodaya Balaarachchi 23 Окт 2018 в 18:31

2 ответа

Лучший ответ

Вы можете использовать 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 и избавить себя от лишних хлопот.

2
WhiZTiM 23 Окт 2018 в 15:46

Учитывая ваш вопрос и предположение, что вы должны использовать массив вместо 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, но, вероятно, в этом нет необходимости, поскольку копия будет выполнять любое неявное преобразование на посимвольной основе.

1
Steven W. Klassen 26 Окт 2018 в 20:18
52952803