Добавить дополнительный нулевой символ к широкой строке

#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...