2016-12-08 9 views
-1

私は多くの場合、文字列の最後に問題があります?????????私はこれを解決する方法を知らず、そのゴミを取得しません。 。 。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? 

おかげでたくさんありがとう!

+2

印刷しているコンソールがこれらの文字をサポートしていない可能性があります。 – selalerer

+0

しかし、その時にはゴミを印刷するときにwcslen(buf)のエキゾチックな数字が90に戻ってexmplae 620に返され、デバッガでは最初の90のwcharsが文字列から来ていることがわかります。その後はゴミです – Vess

+2

(const WCHAR *)buf + L '\ 0''は終端のゼロを付加しません。 – Lyth

答えて

0

あなたはこれで正しい軌道に乗っていた:ニュアンスは、あなたが(コピーなし)のデータへのポインタを取得するとき、あなたはまだdにバッファ上で動作していることである

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

dが有効範囲外になると、それは破壊されます(おそらくデータとともに)ので、ごみを取得することもできます。

wcsncpyは、別に制御する別のバッファにデータをコピーし、終了するゼロを追加してAddElementに渡すのに役立ちます。そして、破棄される予定のデータへのポインタを誤って格納している場合は、常に注意深くチェックしてください。