c++ - wcscpy_s not affecting wchar_t* -
i'm trying load strings database struct, maintain running odd issue. using struct datum,
struct datum { wchar_t* name; wchar_t* lore; };
i tried next code snippet
datum thisdatum; size_t len = 0; wchar_t wbuffer[2048]; mbstowcs_s(&len, wbuffer, (const char*)sqlite3_column_text(pstmt, 1), 2048); if (len) { thisdatum.name = new wchar_t[len + 1]; wcscpy_s(thisdatum.name, len + 1, wbuffer); } else thisdatum.name = 0; mbstowcs_s(&len, wbuffer, (const char*)sqlite3_column_text(pstmt, 2), 2048); if (len) { thisdatum.lore = new wchar_t[len + 1]; wcscpy_s(thisdatum.lore, len + 1, wbuffer); } else thisdatum.name = 0;
however, while thisdatum.name
copies correctly, thisdatum.lore
garbage, except on 2 occassions. if project debug, fine, isn't option. discovered rewriting struct datum
struct datum { wchar_t* lore; wchar_t* name; };
completely fixes issue thisdatum.lore
, gives me garbage thisdatum.name
.
try more this:
struct datum { wchar_t* name; wchar_t* lore; };
wchar_t* widen(const char *str) { wchar_t *wbuffer = null; size_t len = strlen(str) + 1; size_t wlen = 0; mbstowcs_s(&wlen, null, 0, str, len); if (wlen) { wbuffer = new wchar_t[wlen]; mbstowcs_s(null, wbuffer, wlen, str, len); } homecoming wbuffer; }
datum thisdatum; thisdatum.name = widen((const char*)sqlite3_column_text(pstmt, 1)); thisdatum.lore = widen((const char*)sqlite3_column_text(pstmt, 2)); ... delete[] thisdatum.name; delete[] thisdatum.lore;
that beingness said, utilize std::wstring
instead:
struct datum { std::wstring name; std::wstring lore; };
#include <locale> #include <codecvt> std::wstring widen(const char *str) { std::wstring_convert< std::codecvt<wchar_t, char, std::mbstate_t> > conv; homecoming conv.from_bytes(str); }
datum thisdatum; thisdatum.name = widen((const char*)sqlite3_column_text(pstmt, 1)); thisdatum.lore = widen((const char*)sqlite3_column_text(pstmt, 2));
c++ struct wchar-t
No comments:
Post a Comment