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

Posted

技术标签:

【中文标题】如何检查 CComBSTR 是不是以某个前缀开头?【英文标题】:How to check if a CComBSTR starts with a certain prefix?如何检查 CComBSTR 是否以某个前缀开头? 【发布时间】:2013-01-11 12:38:07 【问题描述】:

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

查看CComBSTR Members 下 API 中列出的运算符,它允许进行非常基本的比较,例如 ==、>、

    使用BSRTToArray 创建一个数组,然后在其中迭代前n 个索引以检查a 是否具有特定前缀。 从 CComBSTR 获取 BSTR 并在 BSTR 上做一些比较(还没有弄清楚如何做)

【问题讨论】:

【参考方案1】:

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

BOOL StartsWith(BSTR sValue, const WCHAR* pszSubValue)

    if(!sValue)
        return FALSE;
    return wcsncmp(sValue, pszSubValue, wcslen(pszSubValue)) == 0;

【讨论】:

谢谢!像魅力一样工作。你有什么理由在 c++ 库中提供的所有其他各种字符类型上使用 WCHAR 吗? WCHAR*BSTR 直接兼容,您可以将两者作为参数提供给wcs* 函数。请注意,尽管 null BSTR 仍然是有效值,但它不是 wcs* 函数的有效参数。【参考方案2】:
   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 答案的变体,它允许使用空白前缀字符串。

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

【讨论】:

以上是关于如何检查 CComBSTR 是不是以某个前缀开头?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中检查字符串以(前缀)开头或以(后缀)结尾

在 Bash 中,如何检查字符串是不是以某个值开头?

如何删除所有以某个前缀开头的 MySQL 表?

检查并验证以某个值开头的某个数字是不是可用

如何在C中检查十六进制数(%x)是否以某个数字开头?

检查字符串是不是以正则表达式数字开头