如何检查 CComBSTR 是不是以某个前缀开头?
Posted
技术标签:
【中文标题】如何检查 CComBSTR 是不是以某个前缀开头?【英文标题】:How to check if a CComBSTR starts with a certain prefix?如何检查 CComBSTR 是否以某个前缀开头? 【发布时间】:2013-01-11 12:38:07 【问题描述】:我遇到了一段代码,我需要简单地对给定的 CComBSTR 对象(类似于Y.StartsWith("X")
)进行前缀检查。 C++ 对我来说有点陌生,我最关心的是效率。我不需要以任何方式修改 CComBSTR。我想要的只是返回一个布尔值是否以 X 前缀开头。
查看CComBSTR Members 下 API 中列出的运算符,它允许进行非常基本的比较,例如 ==、>、
-
使用BSRTToArray 创建一个数组,然后在其中迭代前n 个索引以检查a 是否具有特定前缀。
从 CComBSTR 获取 BSTR 并在 BSTR 上做一些比较(还没有弄清楚如何做)
【问题讨论】:
【参考方案1】:wcsncmp
将为您比较有限数量的起始字符:
BOOL StartsWith(BSTR sValue, const WCHAR* pszSubValue)
if(!sValue)
return FALSE;
return wcsncmp(sValue, pszSubValue, wcslen(pszSubValue)) == 0;
【讨论】:
谢谢!像魅力一样工作。你有什么理由在 c++ 库中提供的所有其他各种字符类型上使用 WCHAR 吗?WCHAR*
与BSTR
直接兼容,您可以将两者作为参数提供给wcs*
函数。请注意,尽管 null BSTR
仍然是有效值,但它不是 wcs*
函数的有效参数。【参考方案2】:
BOOL StartsWith(BSTR sValue, BSTR prefix)
if (!prefix)
return TRUE;
auto prefixlen = wcslen(prefix);
if (prefixlen == 0)
return TRUE;
if (!sValue)
return FALSE;
return wcsncmp(sValue, prefix, prefixlen) == 0;
BOOL EndsWith(BSTR sValue, BSTR suffix)
if (!suffix)
return TRUE; // always true if suffix is blank or null
auto suffixlen = wcslen(suffix);
if (suffixlen == 0)
return TRUE; // always true if suffix is blank or null
if (!sValue)
return FALSE;
auto valuelen = wcslen(sValue);
if (suffixlen > valuelen)
return FALSE;
auto skip = valuelen - suffixlen;
return wcsncmp(sValue + skip, suffix, wcslen(suffix)) == 0;
我在这里包含了一个后缀版本,并包含了 Roman R 答案的变体,它允许使用空白前缀字符串。
注意: 这些都没有经过很好的测试
【讨论】:
以上是关于如何检查 CComBSTR 是不是以某个前缀开头?的主要内容,如果未能解决你的问题,请参考以下文章