#c #winapi #ole #widechar
#c #winapi #ole #widechar
Вопрос:
Некоторые структуры Win32 API требуют объединения дополнительного нулевого символа в строку, как в следующем примере, взятом отсюда:
c:temp1.txt »c:temp2.txt ‘»‘
Когда дело доходит до широких строк, какой самый простой способ добавить L’ 0′ в конец существующей широкой строки?
Вот что работает для меня, но кажется слишком громоздким:
wchar_t my_string[10] = L"abc";
size_t len = wcslen(my_string);
wchar_t nullchar[1] = {''};
memcpy(my_string len 1, nullchar, sizeof(wchar_t));
Комментарии:
1. предполагая
my_string
, что это достаточно долгоmy_string[wcslen(my_string) 1]=''
?2. Это просто … и это даже сработало. Пожалуйста, отправьте сообщение в качестве ответа.
3. Вы пометили свой вопрос как
[c ]
, но ваш код мне кажется больше похожим на C; например, в C вы бы использовалиstd::wstring
(который способен хранить встроенные нули) вместо необработанныхwchar_t
массивов в стиле C.4. Исправлено. @AlanBirtles пожалуйста, оставьте свой комментарий в качестве ответа.
Ответ №1:
В вашем примере вы можете просто присвоить значение так же, как и любому другому массиву. Здесь нет ничего особенного 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";
Это будет завершаться двойным нулем.
Комментарии:
1. на самом деле, он даже будет иметь семеричное завершение с нулевым значением 🙂
Ответ №2:
Предполагая, что у вас есть различные пути в a 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
Ответ №3:
предполагая, что my_string достаточно длинный:
my_string[wcslen(my_string) 1]='';
Завершающий null будет преобразован в широкий символ.
(Опубликовано в качестве первого комментария к вопросу)
Комментарии:
1. Я рад, что вы получили свое решение, и спасибо за то, что поделились, я был бы признателен, если бы вы отметили их как ответ, и это будет полезно для другого сообщества.
Ответ №4:
Если вы используете std::wstring
вместо wchar_t[]
, вы можете использовать его operator =
для добавления дополнительного нулевого ограничителя, например:
wstring my_string = L"abc";
...
my_string = L'';
// use my_string.c_str() as needed...