C++ WCHAR manipulations
C++ WCHAR manipulations
我正在用C++开发一个小型Win32应用程序。我很早以前就学习过C++的基础知识,所以现在我完全困惑了,因为C++中的字符串。没有WCHAR
或TCHAR
,只有char
和String
。经过一番调查,我决定不使用TCHAR
。
我认为我的问题很简单,但我找不到如何在C++中操作字符串的明确指南。受PHP编码的影响,过去几年我一直期待一些简单的字符串操作,但这是错误的!
简单地说,我所需要的只是将新数据放入字符串中。
WCHAR* cs = L" ";
swprintf( cs, "NEW DATA" );
这是我的第一次尝试。在调试我的应用程序时,我调查了swprintf只将前2个字符放在我的csvar中。我通过这种方式解决了我的问题:
WCHAR cs[1000];
swprintf( cs, "NEW DATA" );
但一般来说,这个技巧可能会失败,因为在我的情况下,新数据不是常数值,而是另一个变量,可能更宽,超过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);
在这种情况下,nd1和nd2的总字符数可能大于1000个字符,因此关键数据将丢失。
问题是如何将我需要的所有数据复制到以这种方式声明的WCHAR字符串WCHAR* wchar_var;
中而不丢失任何内容?
附言:由于我是俄罗斯人,这个问题可能不清楚。现在让我谈谈这一点,我会努力更清楚、更复杂地解释我的问题。
在现代Windows编程中,可以忽略TCHAR
,而使用wchar_t
(WCHAR
)和Unicode UTF-16。
(TCHAR
是过去的一个模型,当时您希望拥有一个单一的代码库,并同时生成ANSI/MBCS和Unicode构建,从而更改一些预处理器开关,如_UNICODE
和UNICODE
。)
在任何情况下,都应该使用C++和方便的字符串类来简化代码。您可以使用ATL::CString
(对应于Unicode版本中的CStringW
,这是自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());
CString
还提供了operator+
的适当重载来连接字符串(因此您不必计算结果字符串的总长度,为目标字符串动态分配缓冲区或检查现有缓冲区大小,调用wcscpy
、wcscat
,不要忘记释放缓冲区等)
您可以简单地将CString
的实例传递给期望const wchar_t*
(LPCWSTR/PCWSTR
)参数的Win32 API,因为CString
提供了一个到const wchar_t*
的隐式转换运算符。
当您使用WCHAR*
时,您正在调用未定义的行为,因为您有一个指针,但没有使其指向任何有效的对象。您需要找出结果字符串的长度,并为该字符串动态分配空间。例如:
WCHAR* cs;
WCHAR* nd1;
WCHAR* nd2;
nd1 = new WCHAR[lstrlen(L"Some value") + 1]; // +1 for the null terminator
nd2 = new WCHAR[lstrlen(L"Another value") + 1];
cs = new WCHAR[lstrlen(L"The paths are and ") + lstrlen(nd1) + lstrlen(nd2) + 1];
wcscpy(nd1, L"Some value");
wcscpy(nd2, L"Another value"); // Actually these vars stores the path for user selected folder
swprintf( cs, L"The paths are %s and %s", nd1, nd2);
delete[] nd1;
delete[] nd2;
delete[] cs;
但这是非常丑陋和容易出错的。如前所述,您应该使用std::wstring
,类似于以下内容:
std::wstring cs;
std::wstring nd1;
std::wstring nd2;
nd1 = L"Some value";
nd2 = L"Another value";
cs = std::wstring(L"The paths are ") + nd1 + L" and " + nd2;
建议使用ATLCStringW
类而不是原始WCHAR
,这样会方便得多。CCD_ 30是动态分配的C字符串的包装器。它将管理字符串长度&在每次操作后适当地分配内存缓冲区,这样你就不会在意它了。
典型用法:
#include <atlstr.h>
CStringW s;
s.Format(L"The paths are %s and %s", L"Some value", L"Another value");
const WCHAR* wstr = s.GetString(); // To pass to some API that need WCHAR
或
#include <atlstr.h>
CStringW s(L"The paths are ");
s += L"Some value";
s += L" and ";
s += L"Another value";
const WCHAR* wstr = s.GetString(); // To pass to some API that need WCHAR
- MacOS通过在莫哈韦"wchar.h"下破碎的自制啤酒发出叮当声
- VS Code C++:不准确的系统包括路径错误(wchar.h,boost/lambda/lambda.hpp)
- 'const char*'和'WCHAR*'
- 为什么需要与 WCHAR 相关的代码处理
- 无法使用 mingw-w64 g++ 编译:找不到 <wchar.h>
- 无法将参数 1 从 WCHAR 转换为常量字符 *
- 无法使用 swprintf 在 WCHAR* 中打印字符*
- -fshort-wchar 和 std::wstring - 分段错误
- 我应该使用 wchar 还是 char 来加密?
- 【MacOSX 10.15.1】使用 odb 生成数据库,致命错误:wchar.h:没有这样的文件或目录 #include < wchar.h>
- 如何在 C++ 中的 wcstok 中使用常量 WCHAR* 变量?
- 将字符串文本常量定义为 char const* 和 wchar const*
- 比较嵌套 for 循环中的两个 wchar 数组?
- wchar 模式下 pugixml 的链接错误
- strcmp 错误'WCHAR [260]' 'const char *'
- 'Cannot add two pointers'添加带有 WCHAR 的 LPCWSTR
- 如何将CString转换为使用WCHAR的Windows API和自定义函数?
- 从网络数据包复制一串 wchar 时访问冲突
- 如何使用 Win32 WCHAR 执行字符串操作
- C++ WCHAR manipulations