如何搜索 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 开始。您可以使用wstringu16string 并使用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 甚至不是,它只是一个宏。也没有必要使用它,相当于wstringu16string @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() 方法不起作用

搜索以可变整数结尾的子字符串

如何使用 PHP 中的正则表达式在字符串中搜索可以按任何顺序排列的子字符串

如何快速搜索大字符串中的子字符串和周围的字符?

python高效的子字符串搜索[重复]