C++ wchar*和打印它的问题

C++ wchar*和打印它的问题,c++,c,printf,garbage,wchar,C++,C,Printf,Garbage,Wchar,我有个问题,有时候在绳子的末端我会得到很多?????????我不知道如何解决这个问题,不去弄那些垃圾 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';

我有个问题,有时候在绳子的末端我会得到很多?????????我不知道如何解决这个问题,不去弄那些垃圾

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?

非常感谢

你在这方面做得对:

    WCHAR* buf = (WCHAR*)d.GetData();
    buf[length + 1] = L'\0';
细微差别在于,当您得到一个指向数据的指针(不复制)时,您仍然在
d
中对缓冲区进行操作。当
d
超出范围时,它将被销毁(可能是数据),所以您也可以得到任何垃圾


在这里,
wcsncpy
可以帮助将数据复制到另一个单独控制的缓冲区中,添加终止零并将其传递给AddElement。如果您无意中存储了指向将要销毁的数据的指针,请务必仔细检查。

可能您正在打印它的控制台不支持这些字符。但在打印垃圾时,它会返回wcslen(buf)一个非常大的数字,而不是90,它会返回exmplae 620,在调试器中,我可以看到前90个WCHAR来自我的字符串,之后是垃圾
(const WCHAR*),buf+L'\0'
不会附加终止符zero@Vess是的,有wcsncpy(类似于strncpy),字符串的末尾标记有终止符,或者没有。如果已标记,则没有理由尝试向其添加零字符。如果未标记,则需要将长度传递给用零字符标记结尾的函数,否则它无法知道标记的位置。因此,除了
+
不做你想做的事情之外,如果你只需要告诉你使用的是长度,你就不用使用长度!