2014-06-20 50 views
0

我想从数据库加载一些字符串到一个结构,但我一直遇到一个奇怪的问题。使用我的结构数据,wcscpy_s不会影响wchar_t *

struct datum { 
    wchar_t* name; 
    wchar_t* lore; 
}; 

我尝试下面的代码片段

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; 

然而,尽管thisDatum.name正确复制,thisDatum.lore始终是垃圾,除了两个occassions。如果该项目是调试,一切都很好,但这不是一个选项。我还发现,改写了结构数据

struct datum { 
    wchar_t* lore; 
    wchar_t* name; 
}; 

完全修复该问题为thisDatum.lore,但给我的垃圾为thisDatum.name

+0

这不是问题,但最后'else'情况下,调零错误的变量。 – WhozCraig

+0

哎呀,谢谢。这可能是不好的。 – user3758447

+3

为什么不使用'std :: wstring'而不是'wchar_t *'? –

回答

1

尝试更多的东西是这样的:

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); 
    } 
    return 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; 

话虽这么说,我会用std::wstring代替:

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; 
    return 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)); 
+0

+1,用于实际为C++问题提供C++解决方案 – Mgetz