问题描述
某些Win32 API结构要求将一个额外的空字符连接到字符串,如以下示例中摘自here:
c:\ temp1.txt'\ 0'c:\ temp2.txt'\ 0''\ 0'
对于宽字符串,将L'\ 0'附加到现有宽字符串末尾的最简单方法是什么?
这是对我有用的东西,但似乎太麻烦了:
wchar_t my_string[10] = L"abc";
size_t len = wcslen(my_string);
wchar_t nullchar[1] = {'\0'};
memcpy(my_string + len + 1,nullchar,sizeof(wchar_t));
解决方法
在您的示例中,您可以像分配其他数组一样分配值。这里wchar_t
没什么特别的。
my_string
已经有一个空终止符,因此,如果要双重空终止符,只需在其后添加另一个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\0";
这将是双空终止。
,假设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]='\0';
终止的null将被转换为宽字符。
(发布为对该问题的第一条评论)
,如果您使用std::wstring
而不是wchar_t[]
,则可以使用其operator+=
附加额外的空终止符,例如:
wstring my_string = L"abc";
...
my_string += L'\0';
// use my_string.c_str() as needed...