memcpy CString to char*

memcpy CString to char*

本文关键字:char to CString memcpy      更新时间:2023-10-16

我正在尝试使用 memcpy()CString复制到char*,但很难做到这一点。实际上,只复制了第一个字符。这是我的代码:

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 到 LPCSTRLPCWSTRLPCTSTR 的强制转换以及更正的缓冲区分配(需要多个字符,而不仅仅是一个字符)。

另外,我不太确定这是否真的是您需要的。例如,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);

你是

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

尝试

CString str = _T("something");
int size = str.GetLength() + 1;
char* buff = new char[size];
memcpy(buff, str.GetBuffer(), size);