VC ++:如何将CString转换为TCHAR *

时间:2015-05-25 00:58:12

标签: visual-c++ mfc

VC ++:如何将CString值转换为TCHAR *。一个方法是GetBuffer(..)函数。我们可以将CString转换为TCHAR *。

2 个答案:

答案 0 :(得分:5)

CString::GetBuffer()没有进行任何转化,它可以直接访问字符串。

复制CString

TCHAR* buf = _tcsdup(str);
free(buf);

TCHAR* buf = new TCHAR[str.GetLength() + 1];
_tcscpy_s(buf, str.GetLength() + 1, str);
delete[]buf;

但是上面的代码通常没用。你可能想要这样修改它:

TCHAR buf[300];
_tcscpy_s(buf, TEXT("text"));

通常你需要将数据读入缓冲区,所以你想让缓冲区大小大于当前大小。

或者您可以使用CString::GetBuffer(),您可能希望再次使缓冲区大小更大。

GetWindowText(hwnd, str.GetBuffer(300), 300);
str.ReleaseBuffer(); //release immediately
TRACE(TEXT("%s\n"), str);

在其他情况下,您只需要const const TCHAR* cstr = str;

最后,TCHAR不是很有用。如果您的代码兼容ANSI和unicode,那么您也可以只使用unicode。但这只是一个建议。

答案 1 :(得分:2)

这取决于您需要非const TCHAR*的原因。主要有两种情况:

  1. 手动更新CString对象的内容:

    在这种情况下,您必须调用CSimpleStringT::GetBuffer(指定最终字符串的最小长度) ),更新内容,并致电CSimpleStringT::ReleaseBuffer。调用ReleaseBuffer是强制性的,因为它会更新内部状态。未能调用ReleaseBuffer会导致字符串暴露意外行为。

  2. 未能在界面上公开const-correctness:

    如果是这种情况,您可以更新界面以取const TCHAR*而不是{{1}通过传递TCHAR*对象来调用CSimpleStringT::operator PCXSTR
    如果无法更新接口,建议您复制到CString数组并传递指针如果您可以确保实现不会修改TCHAR参数引用的内容,则可以使用TCHAR*代替。{1}}。建议不要这样做,因为它可以通过修改不相关的代码来引入错误。