如何检查CComBSTR是否以某个前缀开头?

时间:2013-01-28 07:42:45

标签: string visual-c++ atl bstr

我遇到了一段代码,我需要在给定的CComBSTR对象上执行前缀检查(类似Y.StartsWith("X"))。 C ++对我来说有点陌生,我最关心的是效率。我不需要以任何方式修改CComBSTR。我想要的是返回一个布尔值,它是否以X前缀开头。

查看CComBSTR Members下API中列出的运算符,它允许进行非常基本的比较,例如==,>,<等等。我有两个关于如何尝试解决这个问题的想法(列出下面)。但是,我没有深入了解什么是最有效/最简单的方法。如果我完全偏离基地,请告诉我。

  1. 使用BSRTToArray创建一个数组,然后迭代前n个索引以检查它是否具有某个前缀。
  2. 从CComBSTR获取BSTR并在BSTR上进行一些比较(尚未确定如何执行此操作)

2 个答案:

答案 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答案的变体,允许空格前缀字符串。

注意: 这些未经过充分测试