C++ WCHAR操作

Ger*_*_RU 6 c++ string winapi char wchar

我正在用C++开发一个小小的Win32应用程序.我很久以前就研究过C++基础知识,所以现在我因为C++中的字符串而感到困惑.没有WCHARTCHAR只有charString.经过一番调查后,我决定不再使用了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因为我是俄罗斯人,问题可能不清楚.现在让我谈谈这个问题,我会尝试更清楚,更复杂地解释我的问题.

Mr.*_*C64 7

在现代Windows编程中,可以忽略TCHAR而不是使用wchar_t(WCHAR)和Unicode UTF-16.

(TCHAR过去的模型,当你想拥有一个代码库,并生成ANSI/MBCS和Unicode构建时,改变一些预处理器开关,如_UNICODEUNICODE.)

无论如何,您应该使用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*.

  • 您不必熟悉ATL即可使用`CString`.你可以只是`#include <atlstr.h>`并使用`CString`及其方便的功能(包括从应用程序资源加载字符串).`CString`在Win32编程中比`std :: wstring`更好地集成. (2认同)