如何搜索 LPWSTR 的子字符串?
Posted
技术标签:
【中文标题】如何搜索 LPWSTR 的子字符串?【英文标题】:How to search a substring of a LPWSTR? 【发布时间】:2021-09-16 12:36:53 【问题描述】:是否有任何函数用于搜索LPWSTR
的子字符串?
LPWSTR a_string = _T("abcdef");
if (a_string .find(L"def") != std::string::npos)
【问题讨论】:
wcsstr @drescherjm 不完全 - 这只是wchar_t*
的宏。无需使用 Win32 函数,但通常不赞成使用此类数组。最好使用wstring
或最近的C++ 版本u16string
@Razec 你不需要那个 LPWSTR 开始。您可以使用wstring
或u16string
并使用either wide or Unicode literals。你实际上可以写auto a_string = L"abcdef";
或auto a_string=u"abcdef";
@PanagiotisKanavos:你不需要从 LPWSTR 开始。或多或少... WinAPI 函数和 Microsoft 基础类都大量使用它。
@SergeBallesta 它是一个宏,而不是一个类型。在编译期间,这只不过是一个wchar_t*
。 API 接受 wchar_t*
。您根本不需要使用该宏。事实上,除非您打算为 ASCII 编译,否则不需要这些宏。它们是 1990 年代命名约定的残余。到 2000 年,这种匈牙利符号已经被认为是一个非常糟糕的主意,经常在“C/C++ 用户期刊”上大肆抨击
【参考方案1】:
a_string
的初始化无效,LPWSTR
不能初始化指向字符串字面量,需要LPCWSTR
。
这是一个指向wchar_t
的美化指针,或者更准确地说是一个最终会扩展为wchar_t*
的宏,它没有成员方法,它不是像std::string
这样的类。您将需要以另一种方式进行操作,例如 pointed out by Dialecticus,例如:
LPCWSTR a_string = L"abcdef";
// or better yet
// auto a_string = L"abcdef";
if (wcsstr(a_string, L"def"))
//...
如果可能的话,您可以完全避免这种情况,就像 Panagiotis Kanavos 在下面的评论中指出的那样,使用 std::wstring
。
【讨论】:
a glorified pointer
甚至不是,它只是一个宏。也没有必要使用它,相当于wstring
或u16string
@PanagiotisKanavos 是的,是的。我怀疑这是出于学术目的。
if UNICODE is defined
应该始终如此。 Windows(NT 行)是一个 Unicode 操作系统,其 ASCII 函数本质上充当包装器。这些宏是 Windows 95 系列的残余,也是 2000 年代初期的过渡期。写auto a_string = L"abcdef";
就够了。 Microsoft C++ docs 不要使用这些宏
@PanagiotisKanavos 是的,当然,但 MS 似乎有时忘记了,我的 VS 带有多字节作为新项目的默认编码。
@PanagiotisKanavos 就像 Serge 提到的那样,如果您深入了解 Windows API,有时您仍然需要使用 LPSTR 和朋友之类的东西。以上是关于如何搜索 LPWSTR 的子字符串?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 C++ 中搜索 std::string 中的子字符串?
如何在 iOS 自动化脚本中搜索字符串中的子字符串? indexOf() 和 search() 方法不起作用