Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;:是否加入WCHAR[]的数组?_C++_String_Unicode - Fatal编程技术网

C++ C++;:是否加入WCHAR[]的数组?

C++ C++;:是否加入WCHAR[]的数组?,c++,string,unicode,C++,String,Unicode,我有一个WCHAR[]s数组。我怎样才能加入他们 我知道数组的长度 [L"foo", L"bar"] => "foo, bar" 循环这些字符串并将它们添加到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) {

我有一个WCHAR[]s数组。我怎样才能加入他们

我知道数组的长度

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

循环这些字符串并将它们添加到
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];
}
std::wstring all;
wchar_t*数据[]={L“foo”,…};
大小数据计数=sizeof(数据)/sizeof(*数据);
对于(大小n=0;n<数据计数;++n)
{
如果(n!=0)
全部+=L“,”;
全部+=数据[n];
}

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

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

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

塞缪尔·克拉奇科解决方案的略微改进版本

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

对于模板函数来说,这似乎是一项很好的工作。我使用此函数连接字符串,但它接受任何支持前向迭代器的容器:

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;
}
注意:如果您没有使用C++11,可以像这样声明迭代器,而不是使用
auto

typename oT::const_iterator it = o.begin();

+因为这是我回答的基础。虽然我会用我所拥有的替换循环处理。您应该将
int n
更改为无符号类型(最好是size\t)。否则编译器会抱怨。@BillyONeal-谢谢你提出
int
/
size\u t
问题。我肯定会使用std::wstring,除非你知道要制作多大的东西。您还应该添加一个空终止符。@zdan:OP明确指定他知道长度。wcscpy和wcscat添加了适当的空终止符——不需要任何终止符。-1用于引发缓冲区溢出和使用Shlemiel-the-painter算法()。@dan04:我同意最好使用std::wstring。我把这篇文章作为一个例子,来说明如何使用C标准库来完成同样的事情。只要弦不是很大,反正也没关系。(画家Shlemiel的算法是C字符串处理系统糟糕透顶的最大原因!)。至于缓冲区溢出,如果OP事先知道长度,就不会发生缓冲区溢出,正如他所指出的那样。@Billy:我将数组长度解释为输入数组元素的数量,而不是结果输出缓冲区的大小。关于wcscat的观点。
vector<wstring> input = { L"foo", L"bar", L"baz" };
wstring out = joinContainer<vector<wstring>, wstring, wstring>(input, L", ");;
wcout << out << endl;
foo, bar, baz
typename oT::const_iterator it = o.begin();