【问题标题】:Contains function for LPCTSTR包含 LPCTSTR 的函数
【发布时间】:2012-10-06 14:57:50
【问题描述】:

我有这样的代码:

int contains(LPCTSTR name)
{
   char * data = "test.txt";
}

如何检查name 是否包含“数据”?谢谢!

【问题讨论】:

  • 如果LPCTSTR 是某种char*const 合格与否),strstr 就是您想要的。如果是某种wchar_t*,则需要先转换data
  • @DanielFischer LPCTSTR 在 Windows 中将是一个 char* 如果程序已编译为支持多字节。如果它已使用 Unicode 支持编译,那么它将是 wchar_t*。
  • @Benj 这就是问题,Unicode 与否?
  • 您要查找数据是否是名称中的子字符串?

标签: c++ c contains


【解决方案1】:

由于您使用的是 Windows 和 TCHAR,因此更惯用的解决方案是:

BOOL contains(LPCTSTR lpName) {
    return _tcsstr(name, _T("data"));
}

除非你的data 故意是char *,在这种情况下答案会改变。

【讨论】:

    【解决方案2】:

    Unicode 或非Unicode,你可以使用Shell Lightweight Utility String Functions

    int contains(LPTSTR name)
    {
        LPTSTR data = _T("test.txt");
        if(StrStrI(name, data) != NULL)
        {
            return 1;
        }
        return 0;
    }
    

    您需要包含shlwapi.h 和链接shlwapi.lib

    还要注意StrStrI 不区分大小写,要区分大小写,它只是StrStr

    【讨论】:

    • 根据StrStrI documentationStrStrIsecond参数是“指向要搜索的子字符串的指针”,所以it在您的示例代码中应该是data(而不是name)。此外,不幸的是,StrStrI 的第一个参数是一个 non-const 字符串,它不尊重name 的 const 正确性(即LPCTSTR,即const TCHAR*) .
    • 没错,但你知道那是一个错字。关于 const 的东西,只需要更改参数...现在更通用了。
    • 错字没问题。但我不喜欢删除输入参数的 const 正确性。从语义上讲,contains() 函数应该改变正在搜索的字符串。
    • 更像是 API 的问题,因为StrStrI 可能不会改变字符串上的任何内容。
    • 我不熟悉StrStrI API,但如果它不改变正在搜索的输入字符串,您可能仍希望将const TCHAR* 传递给contains(),然后@ 987654341@到StrStrI
    【解决方案3】:

    有一个名为strstr 的函数用于检查一个字符串是否包含另一个字符串。但是,由于您使用的是LPCTSTR,因此您应该注意,它可能会因您的项目设置而异。如果您在链接的手册页中阅读更多内容,您会看到它提到 _tcsstr,这是一个可以扩展为正确功能的宏。

    如果您改用 C++ std::string,则有 find 方法。

    【讨论】:

      【解决方案4】:

      其他人建议的 C 方法;由于您使用了标签“c++”,因此您可能希望使用该语言及其功能,例如 bool 返回类型或字符串类。

      此外,由于您正在为 Windows 编写代码(我阅读了 LPCTSTR name 参数),您可能希望使用 Windows 特定的便捷类,例如 CString

      在这种情况下,您可以只使用 CString::Find() method,或将其包装在这样的函数中(应该在 ANSI/MBCS 和 Unicode 版本中编译):

      bool ContainsSomeText(const CString& name)
      {
          const TCHAR* data = _T("test.txt");
          return (name.Find(data) >= 0);
      }
      

      此外,如果您想要 不区分大小写 比较,您可能需要在输入字符串上调用 CString::MakeLower()(在这种情况下,因为您正在修改副本,所以按值传递):

      bool ContainsSomeText(CString name)
      {
          const TCHAR* data = _T("test.txt"); // lower-case
          return (name.MakeLower().Find(data) >= 0);
      }
      

      【讨论】:

      • @FlávioToribio:是的,(...) 的布尔表达式 return 的括号也是,但我认为这是个人编程偏好的问题。
      • 确实如此。我的代码也一样。我本可以只使用 return 而没有 if... 但由于我不知道 OP 想要的函数的语义,我可能会做一些更通用的事情,以便 OP 可以放置更多指令和找到子字符串时的其他内容。
      猜你喜欢
      • 1970-01-01
      • 2016-10-22
      • 1970-01-01
      • 2017-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-05
      相关资源
      最近更新 更多