C ++:加入一个WCHAR [] s数组?

时间:2010-06-04 23:35:05

标签: c++ string unicode

我有一个WCHAR []的数组。我怎么加入他们?

我知道数组长度。

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

4 个答案:

答案 0 :(得分:4)

循环遍历这些字符串并将其添加到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];
}

答案 1 :(得分:0)

您的系统是否有wsprintf()?例如:

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

wsprintf(joined, "%S, %S", a[0], a[1])

答案 2 :(得分:0)

对于模板功能来说,这似乎很不错。我使用此函数来连接字符串,但它需要任何支持前向迭代器的容器:

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();

答案 3 :(得分:-2)

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]);
}

如果分支依赖在循环中,那么改进就是没有。我已经转换为C标准库的wcsXXXX函数,但如果它可用,我会使用std::wstring

编辑:

假设

  

我知道数组长度。

表示“我知道我想加入的字符串数量”,那么你就不能使用我上面发布的内容,这需要你知道编译时的最终目标字符串长度。

如果您在编译时不知道,请使用其他方法(并包含我正在谈论的循环改进):

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]);