Проблемы с wchar* и печатью его C

У меня проблема, иногда в конце строки я получаю много????????? Я не знаю, как это исправить, чтобы не получить этот мусор.,,

USHORT length = (USHORT)d.GetLength();
if (length == 0) {
    cEncodeJsonUtil->AddElement(dataHeader, L"null", false);
}
else {
    WCHAR* buf = (WCHAR*)d.GetData();
    //buf[length + 1] = L'\0'; //bugs like this as well as like buf[length]=L'\0';
    // should I escape here or not ? is this + L'\0' ok ?S?!? Even after excaping still there is trash inside.
    cEncodeJsonUtil->AddElement(dataHeader, (const WCHAR*)buf+ L'\0');
}

cEncodeJson->AddElement просто распечатывает элемент, как это

    wprintf(L"\n\"%s\" : \"%s\"\n", pwszKey, pwszValue);

Я делаю что-то неправильно? Печатается неправильно? Должен ли я использовать:

swprintf(buf, L"%ls", buff); //to copy from the value I get to my own buffer?

Большое спасибо!

1 ответ

Вы были на правильном пути с этим:

    WCHAR* buf = (WCHAR*)d.GetData();
    buf[length + 1] = L'\0';

Нюанс в том, что когда вы получаете указатель на данные (без копирования), вы все равно работаете с буфером в d, когда d выходит из области видимости, он уничтожается (предположительно с данными), так что вы можете также получить любой мусор.

Вот где wcsncpy может помочь скопировать данные в другой буфер, которым вы управляете отдельно, добавить конечный ноль и передать его в AddElement. И всегда тщательно проверяйте, не случайно ли вы храните указатель на данные, которые будут уничтожены.

Другие вопросы по тегам