Ger*_*_RU 6 c++ string winapi char wchar
我正在用C++开发一个小小的Win32应用程序.我很久以前就研究过C++基础知识,所以现在我因为C++中的字符串而感到困惑.没有WCHAR或TCHAR只有char和String.经过一番调查后,我决定不再使用了TCHAR.
我认为我的问题非常简单,但我找不到如何在C++中操作字符串的明确指南.受过PHP编码的影响,过去几年我一直期待一些简单的字符串操作并且错了!
简单地说,我需要的是将新数据放入字符串.
WCHAR* cs = L"\0";
swprintf( cs, "NEW DATA" );
Run Code Online (Sandbox Code Playgroud)
这是我的第一次尝试.调试我的应用程序时,我调查过swprintf只将前2个字符放入我的cs var.我用这种方式解决了我的问题:
WCHAR cs[1000];
swprintf( cs, "NEW DATA" );
Run Code Online (Sandbox Code Playgroud)
但通常这个技巧可能会失败,因为在我的情况下,新数据不是恒定值,而是另一个变量,可能比1000个字符长更宽.我的代码看起来像这样:
WCHAR cs[1000];
WCHAR* nd1;
WCHAR* nd2;
wcscpy(nd1, L"Some value");
wcscpy(nd2, L"Another value"); // Actually these vars stores the path for user selected folder
swprintf( cs, "The paths are %s and %s", nd1, nd2);
Run Code Online (Sandbox Code Playgroud)
在这种情况下,有可能nd1和nd2总字符数可能大于1000个字符,因此关键数据将丢失.
问题是如何将我需要的所有数据复制到以这种方式声明的WCHAR字符串WCHAR* wchar_var;而不丢失任何东西?
PS因为我是俄罗斯人,问题可能不清楚.现在让我谈谈这个问题,我会尝试更清楚,更复杂地解释我的问题.
在现代Windows编程中,可以忽略TCHAR而不是使用wchar_t(WCHAR)和Unicode UTF-16.
(TCHAR过去的模型,当你想拥有一个代码库,并生成ANSI/MBCS和Unicode构建时,改变一些预处理器开关,如_UNICODE和UNICODE.)
无论如何,您应该使用C++和方便的字符串类来简化代码.您可以使用ATL::CString(对应CStringW于Unicode版本,这是自VS2005以来的默认版本)或STL std::wstring.
使用CString,您可以:
CString str1 = L"Some value";
CString str2 = L"Another value";
CString cs;
cs.Format(L"The paths are %s and %s", str1.GetString(), str2.GetString());
Run Code Online (Sandbox Code Playgroud)
CString还提供了适当的重载operator+连接字符串(这样你就不必计算结果字符串的总长度,动态分配为目标字符串缓冲区或检查现有的缓冲区大小,打电话wcscpy,wcscat不要忘记释放缓冲区等)
您可以简单地将实例传递CString给Win32 API expecting const wchar_t*(LPCWSTR/PCWSTR)参数,因为它CString提供了隐式转换运算符const wchar_t*.