我想复制一个 CString
到 char*
使用 memcpy()
而我却难以做到。事实上,只有第一个字符被复制。这是我的代码。
CString str = _T("something");
char* buff = new char();
memcpy(buff, str, str.GetLength() + 1);
在这之后,所有的 buff
包含的是字母 s
.
你可能混合了ASCII和Unicode字符串。如果编译时使用Unicode设置,那么 CString
存储一个Unicode字符串(每个字符两个字节,在你的例子中,第二个字节是0,因此看起来像一个ASCII字符串终止符)。
如果你想要所有的ASCII码。
CStringA str = "something";
char* buff = new char[str.GetLength()+1];
memcpy(buff, (LPCSTR)str, str.GetLength() + 1);
如果你想要所有的Unicode:
CStringW str = L"something";
wchar_t* buff = new wchar_t[str.GetLength()+1];
memcpy(buff, (LPCWSTR)str, sizeof(wchar_t)*(str.GetLength() + 1));
如果你想让它在两种设置下工作。
CString str = _T("something");
TCHAR* buff = new TCHAR[str.GetLength()+1];
memcpy(buff, (LPCTSTR)str, sizeof(TCHAR) * (str.GetLength() + 1));
如果你想把Unicode字符串转换为ASCII字符串。
CString str = _T("something");
char* buff = new char[str.GetLength()+1];
memcpy(buff, (LPCSTR)CT2A(str), str.GetLength() + 1);
请同时识别从str到 LPCSTR
, LPCWSTR
或 LPCTSTR
以及修正后的缓冲区分配(需要多个字符而不是只有一个)。
另外,我也不太确定这是不是你真正需要的。A strdup
比如说,看起来比 new
+ memcpy
.
你只分配了一个内存来存放一个 char
变量。为了实现你的意图,你需要分配足够的内存来容纳完整的字符串。
CString str = _T("something");
LPTSTR buff = new TCHAR[(str.GetLength()+1) * sizeof(TCHAR)]; //allocate sufficient memory
memcpy(buff, str, str.GetLength() + 1);
你是
char
,这将是不够的,除非 CString
是空的,而CString
实例,而不是它所代表的字符串。尝试用
CString str = _T("something");
int size = str.GetLength() + 1;
char* buff = new char[size];
memcpy(buff, str.GetBuffer(), size);