1

我正在尝试将 a 复制CStringchar*using 中memcpy(),但我很难做到。实际上,只复制了第一个字符。这是我的代码:

CString str = _T("something");
char* buff  = new char();

memcpy(buff, str, str.GetLength() + 1);

在此之后,所有buff包含的是字母s

4

3 回答 3

6

您可能正在混合 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

于 2013-10-30T14:15:19.883 回答
3

您只分配了内存来保存char变量。要做你想做的事,你需要分配足够的内存来保存完整的字符串。

CString str = _T("something");
LPTSTR buff = new TCHAR[(str.GetLength()+1) * sizeof(TCHAR)]; //allocate sufficient memory
memcpy(buff, str, str.GetLength() + 1);
于 2013-10-30T14:09:57.777 回答
0

你是

  1. 只分配一个,除非是空的,char否则是不够的,并且CString
  2. 复制CString实例而不是它所代表的字符串。

尝试

CString str = _T("something");
int size = str.GetLength() + 1;
char* buff = new char[size];
memcpy(buff, str.GetBuffer(), size);
于 2013-10-30T14:14:21.713 回答