C ++: присоединиться к массиву WCHAR [] s? - PullRequest
1 голос
/ 05 июня 2010

У меня есть массив WCHAR [] s. Как я могу присоединиться к ним?

Я знаю длину массива.

[L"foo", L"bar"] => "foo, bar"

Ответы [ 4 ]

4 голосов
/ 05 июня 2010

Обведите эти строки и добавьте их в std::wstring:

std::wstring all;

wchar_t *data[] = { L"foo", ... };
size_t data_count = sizeof(data) / sizeof(*data);

for (size_t n = 0; n < data_count; ++n)
{
    if (n != 0)
        all += L", ";
    all += data[n];
}
0 голосов
/ 06 апреля 2012

Это похоже на хорошую работу для шаблонной функции. Я использую эту функцию для объединения строк, но она принимает любой контейнер, поддерживающий прямые итераторы:

template<typename oT, typename sepT, typename rT = oT> rT joinContainer(const oT & o, const sepT & sep) {
    rT out;
    auto it = o.begin();
    while(it != o.end()) {
        out += *it;
        if(++it != o.end()) out += sep;
    }
    return out;
}

Вы можете назвать это так:

vector<wstring> input = { L"foo", L"bar", L"baz" };
wstring out = joinContainer<vector<wstring>, wstring, wstring>(input, L", ");;
wcout << out << endl;

Вывод выглядит так:

foo, bar, baz

Примечание. Если вы не используете C ++ 11, вы можете объявить итератор следующим образом, вместо использования auto:

typename oT::const_iterator it = o.begin();
0 голосов
/ 05 июня 2010

Немного улучшенная версия решения R Samuel Klatchko.

wchar_t *data[] = { L"foo", ... };
size_t data_count = sizeof(data) / sizeof(*data);

wchar_t result[STUFF];

wcscpy(result, data[0]);
for (std::size_t n = 1; n < data_count; ++n)
{
    wcscat(result, L", ");
    wcscat(result, data[n]);
}

Улучшение в том, что нет, если в цикле есть зависимость от ветви. Я преобразовал в wcsXXXX функции стандартной библиотеки C, но я бы использовал std::wstring, если он доступен.

EDIT:

Предполагая

Я знаю длину массива.

означает «Я знаю количество строк, к которым я хотел бы присоединиться», тогда вы не можете использовать то, что я опубликовал выше, что требует, чтобы вы знали конечную длину строки назначения во время компиляции.

Если вы не знаете, во время компиляции, используйте это, которое работает иначе (и содержит улучшение цикла, о котором я говорил):

wchar_t *data[] = { L"foo", ... };
size_t data_count = sizeof(data) / sizeof(*data);

std::wstring result(data[0]); //Assumes you're joining at least one string.
for (std::size_t n = 1; n < data_count; ++n)
    result.append(L", ").append(data[n]);
0 голосов
/ 05 июня 2010

Есть ли в вашей системе wsprintf()? Пример:

wchar_t *a = { L"foo", L"bar" };
wchar_t joined[1000];

wsprintf(joined, "%S, %S", a[0], a[1])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...