VC ++:如何将CString值转换为TCHAR *。一个方法是GetBuffer(..)函数。我们可以将CString转换为TCHAR *。
答案 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*
的原因。主要有两种情况:
手动更新CString对象的内容:
在这种情况下,您必须调用CSimpleStringT::GetBuffer(指定最终字符串的最小长度) ),更新内容,并致电CSimpleStringT::ReleaseBuffer。调用ReleaseBuffer
是强制性的,因为它会更新内部状态。未能调用ReleaseBuffer
会导致字符串暴露意外行为。
未能在界面上公开const-correctness:
如果是这种情况,您可以更新界面以取const TCHAR*
而不是{{1}通过传递TCHAR*
对象来调用CSimpleStringT::operator PCXSTR。
如果无法更新接口,建议您复制到CString
数组并传递指针如果您可以确保实现不会修改TCHAR
参数引用的内容,则可以使用TCHAR*
代替。{1}}。建议不要这样做,因为它可以通过修改不相关的代码来引入错误。