【问题标题】:memcpy CString to char*memcpy CString 到 char*
【发布时间】:2013-10-30 14:06:04
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你不想strcpy吗?
  • 您只为 1 个char 分配空间。然后,您尝试复制 CString 对象,而不是其包含的缓冲区。
  • 小心,_T() 可以根据某些预处理器变量创建基于wchar_t 而不是char 的UNICODE 字符串。 memcpy() 对此一无所知,总是复制字节。

标签: c++ memcpy


【解决方案1】:

您可能正在混合使用 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 简单得多。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 我建议LPTSTR buff = new TCHAR[str.GetLength() + 1] 来缓解我在问题下提到的问题。
    • 不,错误的编辑,它应该是 LPTSTR 而不是 LPSTR,并且您还应该在调用 memcpy() 时将 str.GetLength() + 1 乘以 sizeof(TCHAR),就像 Werner 在他的回答。
    【解决方案3】:

    你是

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

    试试

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

    【讨论】:

      猜你喜欢
      • 2010-10-08
      • 1970-01-01
      • 2013-07-09
      • 2011-08-06
      • 2012-05-25
      • 2016-02-12
      • 1970-01-01
      • 1970-01-01
      • 2015-08-07
      相关资源
      最近更新 更多