我正在尝试将 a 复制CString
到char*
using 中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
的缓冲区分配(需要多个字符,而不仅仅是一个)。
另外,我不太确定这是否真的是您需要的。例如, Astrdup
看起来比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);