如何检查一个CComBSTR字符串是否以某个前缀开头?

3
我遇到了一段代码,需要对给定的CComBSTR对象进行前缀检查(类似于Y.StartsWith("X"))。C ++ 对我来说有点陌生,我最担心的是效率。我不需要以任何方式修改CComBSTR。我想要的只是返回一个布尔值,表示它是否以X前缀开头。
查看API下的CComBSTR成员中列出的运算符,它允许进行非常基本的比较,如==、>、<等。我有两个想法来解决这个问题(如下所示)。然而,我并不深刻理解什么是最有效/最简单的方法。如果我完全偏离了轨道,请告诉我。
  1. 使用BSRTToArray创建一个数组,然后迭代前n个指数,以检查它是否具有特定的前缀。
  2. 从CComBSTR获取BSTR,并对BSTR进行比较(尚未解决如何执行此操作)
2个回答

7

wcsncmp可以帮您比较一定数量的首字符:

BOOL StartsWith(BSTR sValue, const WCHAR* pszSubValue)
{
    if(!sValue)
        return FALSE;
    return wcsncmp(sValue, pszSubValue, wcslen(pszSubValue)) == 0;
}

谢谢!非常顺利。你选择使用C++库中的WCHAR字符类型,有什么特别的原因吗?毕竟还有其他多种字符类型可供选择。 - Shark
2
WCHAR* 可以直接兼容 BSTR,并且您可以将两者作为参数提供给 wcs* 函数。但请注意,空的 BSTR 仍然是一个有效值,而它不是 wcs* 函数的有效参数。 - Roman R.

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;
         }

我在这里包含了一个后缀版本,并包括了 Roman R 的答案变体,允许空前缀字符串。

注意:这些并没有经过充分测试。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接