由于我是Visual C ++的新手,因此处理字符串的类型非常多。当我使用某种类型并继续编码但是在下一步时,有使用其他类型的内置函数&它总是需要将一种类型的字符串转换为其他字符串。我发现这么多的博客,但是当看到这么多的答案时,我很困惑。尝试,但有些正在工作&有些不是。
请提供您的答案或链接,为在visual c ++中处理不同类型的字符串提供最终解决方案。
答案 0 :(得分:5)
这取决于你在做什么。它是一种痛苦,无论你做什么,你将不得不处理转换。
在大多数情况下,std :: string类几乎可以满足任何需求,并且任何习惯于c ++的人都可以轻松阅读。
如果您使用MFC cstring将是最常见和正常的选择
对于C ++ Cli System :: String是标准
所有带有字符串的windows api都会使用null终止的cstyle字符串,但是根据你正在使用的框架工作,你可能不必直接调用很多APi,特别是如果你使用.net
我相信在ATL中还有另外几个字符串类,但我没有太多使用该库。
答案 1 :(得分:2)
Win32系统API在LPCWSTR上运行(指向C样式的NULL终止的wchar_t数组)。 系统头文件提供每个API的两个版本,例如SetWindowTextA(HWND,LPCSTR)和SetWindowTextW(HWND,LPCWSTR)以及宏映射SetWindowText()到相关的版本,具体取决于项目中UNICODE的定义,即:
#ifdef UNICODE
#define SetWindowText SetWindowTextW
#else
#define SetWindowText SetWindowTextA
#endif // !UNICODE
SetWindowTextA()API将从它的LPCSTR参数构建一个临时LPCWSTR并调用操作代码所在的SetWindowTextW(),因此在代码中不使用UNICODE和wchar_t会导致性能下降。
COM接口设计用于在BSTR上运行,BSTR是分配给不同进程之间共享的系统。
很高兴BSTR可以从LPCWSTR构建,MS编译器提供_bstr_t类:_bstr_t myBstr(/ LPCWSTR / psText)。
ATL :: CString和MFC CString类(共享其大部分代码)使用相同的宏机制并映射到CStringA或CStringW。两者都有内置运算符(CStringA :: operator LPCSTR()CStringW :: operator LPCWSTR()),因此您可以将CString传递给Win32 API:
CString myStr = _T("Hello");
::SetWindowText(myHwnd, myStr);
std :: [w] string没有这样的内置运算符,但c_str()成员也没有这样做:
std::wstring myStr = L"Hello"; // assuming UNICODE defined
::SetWindowText(myHwnd, myStr.c_str());
要点:
(#include <atlstr.h>
不包括ATL库)或std :: wstring 。 答案 2 :(得分:0)
另外,请阅读http://www.codeproject.com/KB/string/cppstringguide2.aspx以及该系列的其余部分,以了解C ++中的字符串处理。是的,这很糟糕,这是(IMO)C ++最糟糕的缺点之一。
答案 3 :(得分:0)
在我看来,有两种方法可以去。使用STL std :: string或std :: wstring。或者使用MFC CString。如果我正在编写MFC代码,我总是使用CString。如果您的系统已设置为使用它,则默认情况下允许您使用unicode。然而,据说有很多旧的C / C ++函数不喜欢unicode CStrings使用的基础数据类型。他们中的大多数总是有宽版本,这是找到正确版本使用的问题。 CStrings还拥有大量预先构建的功能; IMO甚至超过了std ::(w)字符串。
如果您计划进行任何COM开发,还有BSTR,但我之前很少使用这种类型的字符串。