将额外的空字符附加到宽字符串

Append extra null char to wide string

一些 Win32 API 结构需要将一个额外的空字符连接到一个字符串,如下例取自 here:

c:\temp1.txt'[=11=]'c:\temp2.txt'[=11=]''[=11=]'

对于宽字符串,将 L'\0' 附加到现有宽字符串末尾的最简单方法是什么?

以下是对我有用但似乎太麻烦的方法:

wchar_t my_string[10] = L"abc";
size_t len = wcslen(my_string);
wchar_t nullchar[1] = {'[=10=]'};
memcpy(my_string + len + 1, nullchar, sizeof(wchar_t));

在您的示例中,您可以像任何其他数组一样分配值。这里wchar_t没什么特别的。

my_string已经有一个null-termination,所以如果你想要双null-termination,那么就在它后面再加一个0。

wchar_t my_string[10] = L"abc";
size_t len = wcslen(my_string);
// todo: check out-of-bounds
my_string[len + 1] = 0;

或者更简单,如果它真的只是一个字符串文字,

wchar_t my_string[10] = L"abc[=11=]";

这将是 doubly-null-terminated。

假设您在 std::vector<std::wstring> 中有各种路径,您可以在循环中构建所需的格式:

std::vector<std::wstring> paths;
paths.emplace_back(L""); // This empty path will add the extra NUL
std::wstring buf(1000, 0);
for (auto p : paths) {
    buf.append(p);
    buf.append(1, 0);
}
wchar_t *ptr = buf.c_str(); // Now do stuff with it

假设 my_string 足够长:

my_string[wcslen(my_string)+1]='[=10=]';

终止 null 将被转换为宽字符。

(作为问题的第一条评论发布)

如果您使用 std::wstring 而不是 wchar_t[],您可以使用其 operator+= 附加额外的空终止符,例如:

wstring my_string = L"abc";
...
my_string += L'[=10=]';
// use my_string.c_str() as needed...