memcpy CString to char*

问题描述 投票:1回答:3

我想复制一个 CStringchar* 使用 memcpy() 而我却难以做到。事实上,只有第一个字符被复制。这是我的代码。

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

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

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

c++ memcpy
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, LPCWSTRLPCTSTR 以及修正后的缓冲区分配(需要多个字符而不是只有一个)。

另外,我也不太确定这是不是你真正需要的。A strdup 比如说,看起来比 new + memcpy.


3
投票

你只分配了一个内存来存放一个 char 变量。为了实现你的意图,你需要分配足够的内存来容纳完整的字符串。

CString str = _T("something");
LPTSTR buff = new TCHAR[(str.GetLength()+1) * sizeof(TCHAR)]; //allocate sufficient memory
memcpy(buff, str, str.GetLength() + 1);

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);
© www.soinside.com 2019 - 2024. All rights reserved.