String 如何检查CComBSTR是否以某个前缀开头?
我遇到了一段代码,需要对给定的CComBSTR对象执行前缀检查(类似于String 如何检查CComBSTR是否以某个前缀开头?,string,visual-c++,atl,bstr,String,Visual C++,Atl,Bstr,我遇到了一段代码,需要对给定的CComBSTR对象执行前缀检查(类似于Y.StartsWith(“X”))。C++对我来说有点陌生,我最大的担心是效率。我不需要以任何方式修改CComBSTR。我只想返回一个布尔值,它是否以X前缀开头 查看下面API中列出的运算符,它允许进行非常基本的比较,如==,>,将为您比较有限数量的起始字符: BOOL StartsWith(BSTR sValue, const WCHAR* pszSubValue) { if(!sValue) re
Y.StartsWith(“X”)
)。C++对我来说有点陌生,我最大的担心是效率。我不需要以任何方式修改CComBSTR。我只想返回一个布尔值,它是否以X前缀开头
查看下面API中列出的运算符,它允许进行非常基本的比较,如==,>,将为您比较有限数量的起始字符:
BOOL StartsWith(BSTR sValue, const WCHAR* pszSubValue)
{
if(!sValue)
return FALSE;
return wcsncmp(sValue, pszSubValue, wcslen(pszSubValue)) == 0;
}
我在这里加入了后缀版本,并加入了Roman R答案的变体,允许使用空白前缀字符串
注意:这些没有经过很好的测试谢谢!工作得很有魅力。是否有任何理由让您在WCar上使用C++中的所有其他字符类型?<代码> WCHAR */COD>直接与<代码> BSTR < /C> >兼容,并且可以提供两个参数作为<代码> WCS*<代码>函数。请注意,null
BSTR
仍然是有效值,但它不是wcs*
函数的有效参数。
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;
}