我遇到了一段代码,我需要在给定的CComBSTR对象上执行前缀检查(类似Y.StartsWith("X")
)。 C ++对我来说有点陌生,我最关心的是效率。我不需要以任何方式修改CComBSTR。我想要的是返回一个布尔值,它是否以X前缀开头。
查看CComBSTR Members下API中列出的运算符,它允许进行非常基本的比较,例如==,>,<等等。我有两个关于如何尝试解决这个问题的想法(列出下面)。但是,我没有深入了解什么是最有效/最简单的方法。如果我完全偏离基地,请告诉我。
答案 0 :(得分:7)
wcsncmp
将为您比较有限数量的起始字符:
BOOL StartsWith(BSTR sValue, const WCHAR* pszSubValue)
{
if(!sValue)
return FALSE;
return wcsncmp(sValue, pszSubValue, wcslen(pszSubValue)) == 0;
}
答案 1 :(得分:0)
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;
}
我在这里添加了一个后缀版本,其中包含一个罗马R答案的变体,允许空格前缀字符串。
注意: 这些未经过充分测试