3

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

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

  1. 使用BSRTToArray创建一个数组,然后在其中迭代前 n 个索引以检查它是否具有某个前缀。
  2. 从 CComBSTR 获取 BSTR 并在 BSTR 上进行一些比较(还没有弄清楚如何做到这一点)
4

2 回答 2

7

wcsncmp将为您比较有限数量的起始字符:

BOOL StartsWith(BSTR sValue, const WCHAR* pszSubValue)
{
    if(!sValue)
        return FALSE;
    return wcsncmp(sValue, pszSubValue, wcslen(pszSubValue)) == 0;
}
于 2013-01-28T07:49:17.443 回答
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 答案的变体,它允许使用空白前缀字符串。

注意: 这些都没有经过很好的测试

于 2016-12-06T23:00:07.197 回答