我有一个WCHAR []的数组。我怎么加入他们?
我知道数组长度。
[L"foo", L"bar"] => "foo, bar"
答案 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]);